在 pd.dataframe 个值对象上使用字典理解

Using dictionary comprehension on pd.dataframe value objects

我有一个字典,其中 pd.DataFrame 个对象作为字典值:

key_names=['country_1','country_2','country_3']

data_1 = [['Alex',10],['Bob',11],['Clarke',4]]
df_1 = pd.DataFrame(data_1,columns=['Name','Age'])

data_2 = [['Tom',13],['Zoe',21],['Tom',13]]
df_2 = pd.DataFrame(data_1,columns=['Name','Age'])

data_3 = [['Felix',16],['Rich',22],['Phil',23]]
df_3 = pd.DataFrame(data_1,columns=['Name','Age'])

dfs=[df_1,df_2,df_3]

wb_dict=dict(zip(key_names,dfs))

我正在尝试将 pd.DataFrame 中的所有文本小写 &我已经成功地使用 for 循环做到了:

for k,v in wb_dict.items(): 
    wb_dict[k]=wb_dict[k].astype(str).apply(lambda x:x.str.lower())

并在字典理解中使用 .apply()

wb_dict= {k: wb_dict[k].astype(str).apply(lambda x:x.str.lower()) for k, v in wb_dict.items()}

但这两种方法似乎都比实际需要的要慢。

我已经尝试避免使用 .apply() ,我认为这会减慢它的速度。我做空了:

{(lambda x:x.str.lower()) for x in  wb_dict[k].astype(str) for k, v in wb_dict.items()}

结果是一堆 lambda 函数对象。

您可以使用 assign 覆盖现有的列值。请注意,与您的循环类似,这会使数字列(例如“年龄”)成为 dtype 对象列,这可能不是您想要做的事情。

out = {k: df.assign(**{col: df[col].astype(str).str.lower() for col in df.columns}) for k, df in wb_dict.items()}

输出:

{'country_1':      Name Age
 0    alex  10
 1     bob  11
 2  clarke   4,
 'country_2':      Name Age
 0    alex  10
 1     bob  11
 2  clarke   4,
 'country_3':      Name Age
 0    alex  10
 1     bob  11
 2  clarke   4}