如何更快地迭代 DataFrame 中的行?

Posted

技术标签:

【中文标题】如何更快地迭代 DataFrame 中的行?【英文标题】:How to iterate faster over rows in a DataFrame? 【发布时间】:2021-07-09 17:01:31 【问题描述】:

我有一个来自 Pandas 的 DataFrame:

import pandas as pd
data = ['c1':'aaa', 'c2':100, 'c3': 99, 'c4': 0, 'c1':'bbb','c2':110, 'c3': 89, 'c4': 0, 
'c1':'aaa','c2':NaN,'c3': 93, 'c4': 0,'c1':'ccc', 'c2':130,'c3': 77, 'c4': 0, 
'c1':'ddd','c2':140,'c3': 54, 'c4': 0, 'c1':'bbb','c2':NaN,'c3': 76, 'c4': 0,
'c1':'ddd', 'c2':NaN,'c3': 75, 'c4': 0]
df = pd.DataFrame(data)
print df

输出:

   c1    c2   c3  c4
0 'aaa'  100  99  0
1 'bbb'  110  89  0
2 'aaa'  100  93  0
3 'ccc'  130  77  0
4 'ddd'  140  54  0
5 'bbb'  110  76  0
6 'ddd'  140  75  0

现在,我希望对于与列 c1 匹配的每一行,将列 c4 设置为等于与第一个字段匹配的另一行的列 c2。结果:

   c1    c2   c3  c4
0 'aaa'  100  99  0
1 'bbb'  110  89  0
2 'aaa'  100  93  100
3 'ccc'  130  77  0
4 'ddd'  140  54  0
5 'bbb'  110  76  110
6 'ddd'  140  75  140

这个数据框是一个例子,真正的数据框有更多的列和更多的行(大约 400 万)。我最初的想法是这样的:

for index, row in df.iterrows(): 
    df[df.c1==row.c1].iloc[1].c4= row.c2

只能有另一个匹配的行。显然,使用 iterrows 的过程非常缓慢。

【问题讨论】:

不要重复,df.groupby("c1")['c2'].ffill() 我认为会这样做 我更新了问题... 【参考方案1】:

根据您的最新编辑,您可以使用 df.groupby 填充,然后使用 shift 将值在组之后向下移动 1 行:

df['c4'] = df.groupby("c1")['c2'].shift().fillna(df['c4'])

      c1   c2  c3     c4
0  'aaa'  100  99    0.0
1  'bbb'  110  89    0.0
2  'aaa'  100  93  100.0
3  'ccc'  130  77    0.0
4  'ddd'  140  54    0.0
5  'bbb'  110  76  110.0
6  'ddd'  140  75  140.0

【讨论】:

以上是关于如何更快地迭代 DataFrame 中的行?的主要内容,如果未能解决你的问题,请参考以下文章

更快地遍历一个 DataFrame 的行以将列添加到第二个 DataFrame

pandas遍历dataframe的行:迭代遍历dataframe的数据行iterrows函数itertuple函数

将 Pandas DataFrame 的行作为字典进行迭代

如何更快地进行三重 foreach?

将 pandas Dataframe 的行转换为可迭代的字符串列表

在 pandas DataFrame 中有效地搜索列表值的组合