将值返回到pandas df中的新列

时间:2018-05-24 06:11:58

标签: python pandas indexing apply

我有一份销售数据。我想再添加两列,突出显示其他列中的重要值。

目前我的代码会在每次销售时将值返回到新列中。因此,如果主题出现在Sales列中,则相应的值将在新列中编入索引。

import pandas as pd
import numpy as np

a = 5
N = 10

df = pd.DataFrame({
    'Tom_$' : [500, 50, 10, 60, 50, 77, 30, 600, 40, 60],
    'Tom_c' : [100, 20, 40, 50, 0, 67, 90, 100, 0, 0],
    'Code' : ['nan', 'nan', 'Big', 'nan', 'nan', 'Small', 'nan','nan', 'nan','nan'],                                 
    'Sales' : ['nan','nan','Tom','nan','nan','Tom','nan','nan','nan','nan']})


df['Big'] = df.apply(lambda row: row.get(row['Sales']+'_$') if pd.notnull(row['Sales']) else np.nan, axis=1)
df['Small'] = df.apply(lambda row: row.get(row['Sales']+'_c') if pd.notnull(row['Sales']) else np.nan, axis=1)

输出:

    Code  Julie_$  Julie_c  Sales  Tom_$  Tom_c  Dollars  Cents
0    nan      500      300    nan    500    100      NaN    NaN
1    nan       40       20    nan     50     20      NaN    NaN
2    Big       10       70    Tom     10     40     10.0   40.0
3    nan       10       50    nan     60     50      NaN    NaN
4    nan       50       80    nan     50      0      NaN    NaN
5  Small       37       67    Tom     77     67     77.0   67.0
6    nan       30       50    nan     30     90      NaN    NaN
7    Big      900      100  Julie    600    100    900.0  100.0
8    nan       40       40    nan     40      0      NaN    NaN
9    nan       50        0    nan     60      0      NaN    NaN

这很好用,但我想使用Code列添加另一个图层。如果此列中的值为Big,我希望继续返回销售员值,直到新的销售为止。如果它是Small我不在乎。

所以输出结果为:

    Code  Julie_$  Julie_c  Sales  Tom_$  Tom_c  Dollars  Cents
0    nan      500      300    nan    500    100      NaN    NaN
1    nan       40       20    nan     50     20      NaN    NaN
2    Big       10       70    Tom     10     40     10.0   40.0
3    nan       10       50    nan     60     50     60.0   50.0
4    nan       50       80    nan     50      0     50.0    0.0
5  Small       37       67    Tom     77     67     77.0   67.0
6    nan       30       50    nan     30     90      NaN    NaN
7    Big      900      100  Julie    600    100    900.0  100.0
8    nan       40       40    nan     40      0     40.0    0.0
9    nan       50        0    nan     60      0     60.0    0.0

我考虑使用类似的方法返回Sales

之类的值
df['Dollars'] = df.apply(lambda row: row.get(row['Sales']+'_$') if pd.notnull(row['Sales']) else np.nan, axis=1)
df['Cents'] = df.apply(lambda row: row.get(row['Sales']+'_c') if pd.notnull(row['Sales']) else np.nan, axis=1)

但这仅在值处于同一索引时才有效。我有点困惑。我不确定是否应填写数据,因此Code列中始终存在值。

      Code
0      nan
1      nan
2      Big
3      Big
4      Big
5    Small
6    Small
7      Big
8      Big
9      Big

然后我可以选择重要的那些。但我不愿改变原始数据集。

1 个答案:

答案 0 :(得分:0)

您可以在NaN列的Sales列中使用ffill的替换值,通过前缀CodeBig或{{ 1}}:

Small