如何使用依赖于其他动态列的值有效地将多个列添加到pandas数据框中

时间:2018-02-15 20:37:54

标签: python performance pandas dynamic

如何使用更好的解决方案而不是以下代码?在包含大量列的大数据集中,此代码需要花费太多时间

import pandas as pd

df = pd.DataFrame({'Jan':[10,20], 'Feb':[3,5],'Mar':[30,4],'Month':
                   [3,2],'Year':[2016,2016]})

#     Jan   Feb   Mar    Month  Year
# 0   10     3    30     3      2016
# 1   20     5    4      2      2016

df1['Antal_1']= np.nan
df1['Antal_2']= np.nan

for i in range(len(df)):
    if df['Yaer'][i]==2016:
        df['Antal_1'][i]=df.iloc[i,df['Month'][i]-1]
        df['Antal_2'][i]=df.iloc[i,df['Month'][i]-2]
    else:
        df['Antal_1'][i]=df.iloc[i,-1]
        df['Antal_2'][i]=df.iloc[i,-2]
df
#     Jan   Feb   Mar    Month  Year  Antal_1  Antal_2
# 0   10     3    30     3      2016    30       3
# 1   20     5    4      2      2016    5       20

2 个答案:

答案 0 :(得分:1)

使用df.apply代替迭代行,您应该看到边际加速:

import pandas as pd

df = pd.DataFrame({'Jan': [10, 20], 'Feb': [3, 5], 'Mar': [30, 4],
                   'Month': [3, 2],'Year': [2016, 2016]})

df = df[['Jan', 'Feb', 'Mar', 'Month', 'Year']]

def calculator(row):
    m1 = row['Month']
    m2 = row.index.get_loc('Month')
    return (row[int(m1-1)], row[int(m1-2)]) if row['Year'] == 2016 \
           else (row[m2-1], row[m2-2])

df['Antal_1'], df['Antal_2'] = list(zip(*df.apply(calculator, axis=1)))

#    Jan  Feb  Mar  Month  Year  Antal_1  Antal_2
# 0   10    3   30      3  2016       30        3
# 1   20    5    4      2  2016        5       20

答案 1 :(得分:0)

我不清楚在2016年不是2016年的情况下你想做什么,所以我的价值是100。举一个例子,我可以完成它。如果它只是NaNs,那么你可以从下面删除前两行。

df['Antal_1'] = 100
df['Antal_2'] = 100
df.loc[df['Year']==2016, 'Antal_1'] = df[df.columns[df.columns.get_loc("Month")-1]]
df.loc[df['Year']==2016, 'Antal_2'] = df[df.columns[df.columns.get_loc("Month")-2]]