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

2024-09-24 22:22:05 发布

您现在位置:Python中文网/ 问答频道 /正文

如何使用更好的解决方案而不是遵循代码?在有很多列的大数据集中,这段代码花费了太多的时间

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

Tags: 数据代码dfnpnan解决方案yearmar
2条回答

我不清楚在不是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]]

通过使用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

相关问题 更多 >