2017-06-23 40 views
0

我有一个包含字符串和NaN的数据框。我想str.lower()某些专栏名称to_lower = ['b', 'd', 'e']。理想情况下,我可以在整个数据框中使用方法,而不是使用df[to_lower]上的方法。我有按名称使用数据框方法的小写字母列

df[to_lower] = df[to_lower].apply(lambda x: x.astype(str).str.lower())

但我想一个办法做到这一点不分配到所选列。

df = pd.DataFrame({'a': ['A', 'a'], 'b': ['B', 'b']}) 
to_lower = ['a'] 
df2 = df.copy() 
df2[to_lower] = df2[to_lower].apply(lambda x: x.astype(str).str.lower()) 
+0

你的方法不结果没有分配给所选列。它返回一个新的数据框。如果你想将它们分配给新的列,'df [new_columns] = df [to_lower] .apply(lambda x:x.astype(str).str.lower())'? – Psidom

+0

@Psidom是这就是我的意思,编辑问题 – Hatshepsut

+0

如果您不想更改'to_lower'列,只需提供新列名作为'new_columns'。 – Psidom

回答

1

您可以使用assign方法和解压结果作为关键字参数:

df = pd.DataFrame({'a': ['A', 'a'], 'b': ['B', 'b'], 'c': ['C', 'c']}) 
to_lower = ['a', 'b'] 

df.assign(**df[to_lower].apply(lambda x: x.astype(str).str.lower())) 

# a b c 
#0 a b C 
#1 a b c 
+0

是否可以在'assign'内不使用'df'名称来做到这一点,所以我可以在一连串的方法中做到这一点? – Hatshepsut

0

你想这样的:

for column in to_lower: 
    df[column] = df[column].str.lower() 

这是更为有效的假设你有比列多行。

+0

是否可以做到这一点,返回一个新的数据框,而不是改变原来的? – Hatshepsut

相关问题