Python 使用For循环参数对数据帧应用Zip函数
我有一个名为handle text的函数,用于重命名dataframe列中的值:Python 使用For循环参数对数据帧应用Zip函数,python,pandas,for-loop,dataframe,Python,Pandas,For Loop,Dataframe,我有一个名为handle text的函数,用于重命名dataframe列中的值: def handle_text(txt): if txt.lower()[:6] == 'deu_ga': return 'Western Europe', 'Germany' elif txt.lower()[:6] == 'fra_ga': return 'Western Europe', 'France' return 'Other', 'Other' 我通过以下方式将handle_文本应
def handle_text(txt):
if txt.lower()[:6] == 'deu_ga':
return 'Western Europe', 'Germany'
elif txt.lower()[:6] == 'fra_ga':
return 'Western Europe', 'France'
return 'Other', 'Other'
我通过以下方式将handle_文本应用于各种数据帧:
campaigns_df['Region'], campaigns_df['Market'] = zip(*campaigns_df['Campaign Name'].apply(handle_text))
atlas_df['Region'], atlas_df['Market'] = zip(*atlas_df['Campaign Name'].apply(handle_text))
flashtalking_df['Region'], flashtalking_df['Market'] = zip(*flashtalking_df['Campaign Name'].apply(handle_text))
我想知道是否有一种方法可以执行for循环,从而将函数同时应用于各种dfs:
dataframes = [atlas_df, flashtalking_df, innovid_df, ias_viewability_df, ias_fraud_df]
columns_df = ['Campaign Name']
for df in dataframes:
for column in df.columns:
if column in columns_df:
zip(df.column.apply(handle_text))
但是,我得到的错误是:
AttributeError: 'DataFrame' object has no attribute 'column'
需要通过
将属性访问更改为更一般的[]
:
zip(df.column.apply(handle_text))
到
编辑:
更好的解决方案:
atlas_df = pd.DataFrame({'Campaign Name':['deu_gathf', 'deu_gahf', 'fra_gagg'],'another_col':[1,2,3]})
flashtalking_df = pd.DataFrame({'Campaign Name':['deu_gahf','fra_ga', 'deu_gatt'],'another_col':[4,5,6]})
dataframes = [atlas_df, flashtalking_df]
columns_df = 'Campaign Name'
您可以通过dict
映射,然后创建新列:
d = {'deu_ga': ['Western Europe','Germany'], 'fra_ga':['Western Europe','France']}
for df in dataframes:
df[['Region','Market']] = pd.DataFrame(df[columns_df].str.lower()
.str[:6]
.map(d)
.values.tolist())
#print (df)
print (atlas_df)
Campaign Name another_col Region Market
0 deu_gathf 1 Western Europe Germany
1 deu_gahf 2 Western Europe Germany
2 fra_gagg 3 Western Europe France
print (flashtalking_df)
Campaign Name another_col Region Market
0 deu_gahf 4 Western Europe Germany
1 fra_ga 5 Western Europe France
2 deu_gatt 6 Western Europe Germany
我是这样解决的:
dataframes = [atlas_df, flashtalking_df, innovid_df, ias_viewability_df, ias_fraud_df, mediaplan_df]
columns_df = 'Campaign Name'
for df in dataframes:
df['Region'], df['Market'] = zip(*df[columns_df].apply(handle_text))
非常感谢。我如何设置for循环的结果,以便为每个df创建两个新列:
new_columns=['Region','Market']
我尝试将:df.new_columns=zip(df[column].apply(handle_text))
放在for循环的末尾,但当我调用其中一个dfsHmm时,什么都没有出现,为什么要使用zip
?有必要吗?如果我在以旧方式应用函数时不使用zip,即:atlas_-df['Region',atlas_-df['Market']=zip(*atlas_-df['Campaign Name'].apply(handle_-text))
则我会得到以下错误:ValueError:要解包的值太多(预期为2)
我认为有必要确保函数生成两个不同的列(地区和市场),以便它可以将西欧
分配给新创建的地区列,将德国
分配给atlas_df
是上新创建的市场列,我有个问题-在列中\u df=['Campaign Name']
可以是多个值吗?不一定。如果解决方案更容易,我们可以使用:dataframes=[atlas_-df,flashtalking_-df,innovid_-df,ias_-viewability_-df,ias_-fraud_-df]新列=['Region',Market']数据框中的df:for列中的列。列:如果列中的'Campaign Name':df.new_-columns=zip(df[列]。应用(句柄文本))
然而,当我回忆起atlas_df时,没有atlas_df[市场]和atlas_df[区域]
dataframes = [atlas_df, flashtalking_df, innovid_df, ias_viewability_df, ias_fraud_df, mediaplan_df]
columns_df = 'Campaign Name'
for df in dataframes:
df['Region'], df['Market'] = zip(*df[columns_df].apply(handle_text))