Python 使用For循环参数对数据帧应用Zip函数

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_文本应

我有一个名为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_文本应用于各种数据帧:

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))