【问题标题】:Can I set dataframe values without using iterrows()?我可以在不使用 iterrows() 的情况下设置数据帧值吗?
【发布时间】:2015-09-23 04:18:30
【问题描述】:

原始数据集

In [2]: import pandas as pd
   ...: 
   ...: # Original DataSet
   ...: d = {'A': [1,1,1,1,2,2,2,2,3],
   ...:      'B': ['a','a','a','x','b','b','b','x','c'],
   ...:      'C': [11,22,33,44,55,66,77,88,99],}
   ...: 
   ...: df = pd.DataFrame(d)
   ...: df

Out[2]: 
   A  B   C
0  1  a  11
1  1  a  22
2  1  a  33
3  1  x  44
4  2  b  55
5  2  b  66
6  2  b  77
7  2  x  88
8  3  c  99

给定一个数据框,我想要一种灵活、有效的方法来根据两列中的特定条件重置特定值。

条件:

  • 在 B 列中:对于任何值为“x”的行,
  • 在 C 列中:将这些行元素的值设置为下一行的值。

期望的结果

Out[3]: 
   A  B   C
0  1  a  11
1  1  a  22
2  1  a  33
3  1  x  55
4  2  b  55
5  2  b  66
6  2  b  77
7  2  x  99
8  3  c  99

我了解到我可以使用iterrows()(见下文)来完成此操作,

# Code that produces the above outcome
for idx, x_row in df[df['B'] == 'x'].iterrows():
    df.loc[idx, 'C'] = df.loc[idx+1, 'C']
df

但我需要多次这样做,我理解iterrows() is slow。有没有更好的 pandas-y、类似广播的方式来更有效地获得预期的结果?

【问题讨论】:

    标签: python python-3.x pandas dataframe


    【解决方案1】:

    这应该做你想做的:

    df.C[df.B == 'x'] = df.C.shift(-1)
    

    【讨论】:

    • 非常感谢您的快速响应。我会试试这个。
    猜你喜欢
    • 2021-07-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-16
    • 2017-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多