【发布时间】:2018-05-24 06:11:58
【问题描述】:
我有一个 df 的销售数据。我想再添加两列突出显示其他列中的重要值。
目前,我有代码可以在进行销售时将值返回到新列中。因此,如果主题出现在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
然后我可以选择重要的。但我不愿意更改原始数据集。
【问题讨论】:
标签: python pandas indexing apply