通过list Comprehension将str.lower应用于Pandas

时间:2016-12-01 09:56:51

标签: python pandas list-comprehension

我有一个格式为的数据框df:

    animal    fruit
0    "Dog"    "Apple"
1    "Cat"    "Banana"
2    "Rat"    "Grape"

我想将str.lower()应用于所有列(但不是标题)。

本作品:

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

如何将其写为列表组合?

我试过了:

df[i] = [df[i].str.lower() for i in df]

但这不起作用,我得到了:

TypeError: list indices must be integers, not instancemethod

在列表理解中我必须改变什么才能使其工作?

其次,是否有更多" Pandas-onicy"这样做的方式一般,也许使用pandas.apply()函数?

非常感谢你的帮助。

2 个答案:

答案 0 :(得分:2)

列表推导的输出是Series的列表。所以需要concat list

L = [df[i].str.lower() for i in df]
print (L)
[0    dog
1    cat
2    rat
Name: animal, dtype: object, 0     apple
1    banana
2     grape
Name: fruit, dtype: object]

df1 = pd.concat(L, axis=1)
print (df1)
  animal   fruit
0    dog   apple
1    cat  banana
2    rat   grape

apply的解决方案:

print (df.apply(lambda x: x.str.lower()))
  animal   fruit
0    dog   apple
1    cat  banana
2    rat   grape

<强>计时

df = pd.concat([df]*1000).reset_index(drop=True)
df = pd.concat([df]*1000, axis=1)
df.columns = range(len(df.columns))
#[3000 rows x 2000 columns]
print (df)

In [89]: %timeit (pd.concat([df[i].str.lower() for i in df], axis=1))
1 loop, best of 3: 2.3 s per loop

In [90]: %timeit (df.apply(lambda x: x.str.lower()))
1 loop, best of 3: 2.63 s per loop

In [91]: %timeit (df.stack().str.lower().unstack())
1 loop, best of 3: 5.04 s per loop

答案 1 :(得分:1)

您可以stack使其成为一个列,然后调用str.lower,然后调用unstack以恢复列:

In [74]:
df = df.stack().str.lower().unstack()
df

Out[74]:
  animal   fruit
0    dog   apple
1    cat  banana
2    rat   grape