在熊猫中,如何根据另一行中的另一列值更新一行中的列值

时间:2019-05-14 07:48:12

标签: python pandas dataframe

我想基于不同行中另一个单元格的值来更新一个单元格中的值。

我的数据框如下:

OrderId   OrderType   Exch
    P_001       P         NYSE
    P_001_1     C          | | 
    P_002       P          |CHIX|
    P_002_1     C          | |
    P_002_2     C          | |

我希望结果是

OrderId   OrderType    Exch

P_001       P          |NYSE|
P_001_1     C          |NYSE|
P_002       P          |CHIX|
P_002_1     C          |CHIX|
P_002_2     C          |CHIX|

我可以使用.loc更新相同的行,但是无法在Pandas数据框中找到任何解决方案来进行此类更新。

当我问这个问题时,我尝试拆分订单ID并在数据框中搜索以更新Exch值。

2 个答案:

答案 0 :(得分:1)

如果缺少不存在的值,请使用前向填充缺少的值:

df['Exch'] = df['Exch'].ffill()

或将Series.str.split用于新的DataFrame,并按第一列和第二列与GroupBy.transformGroupBy.first分组:

df1 = df['OrderId'].str.split('_', expand=True)
df['Exch'] = df.groupby([df1[0], df1[1]])['Exch'].transform('first')

print (df)
   OrderId OrderType  Exch
0    P_001         P  NYSE
1  P_001_1         C  NYSE
2    P_002         P  CHIX
3  P_002_1         C  CHIX
4  P_002_2         C  CHIX

另一个想法是使用P获取行,创建Series和map

s = df[df['OrderType'].eq('P')].set_index('OrderId')['Exch']
df['Exch'] = df['OrderId'].str.rsplit('_', n=1).str[0].map(s).fillna(df['Exch'])
print (df)
   OrderId OrderType  Exch
0    P_001         P  NYSE
1  P_001_1         C  NYSE
2    P_002         P  CHIX
3  P_002_1         C  CHIX
4  P_002_2         C  CHIX

答案 1 :(得分:0)

df= df.ffill(axis = 0) 
print(df)

         a  b     c
0    P_001  P  NYSE
1  P_001_1  C  None
2    P_002  P  CHIX
3  P_002_1  C  None
4  P_002_2  C  None
         a  b     c
0    P_001  P  NYSE
1  P_001_1  C  NYSE
2    P_002  P  CHIX
3  P_002_1  C  CHIX
4  P_002_2  C  CHIX

如果您想在while日期集中这样做。