熊猫数据框 - 配对存储桶中的行
Posted
技术标签:
【中文标题】熊猫数据框 - 配对存储桶中的行【英文标题】:Pandas dataframe - pairing off rows within a bucket 【发布时间】:2015-06-23 01:02:31 【问题描述】:我有一个如下所示的数据框:
bucket type v
0 0 X 14
1 1 X 10
2 1 Y 11
3 1 X 15
4 2 X 16
5 2 Y 9
6 2 Y 10
7 3 Y 20
8 3 X 18
9 3 Y 15
10 3 X 14
所需的输出如下所示:
bucket type v v_paired
0 1 X 14 nan (no Y coming before it)
1 1 X 10 nan (no Y coming before it)
2 1 Y 11 14 (highest X in bucket 1 before this row)
3 1 X 15 11 (lowest Y in bucket 1 before this row)
4 2 X 16 nan (no Y coming before it in the same bucket)
5 2 Y 9 16 (highest X in same bucket coming before)
6 2 Y 10 16 (highest X in same bucket coming before)
7 3 Y 20 nan (no X coming before it in the same bucket)
8 3 X 18 20 (single Y coming before it in same bucket)
9 3 Y 15 18 (single Y coming before it in same bucket)
10 3 X 14 15 (smallest Y coming before it in same bucket)
目标是构造v_paired列,规则如下:
在同一个存储桶中查找在此存储桶之前、具有相反类型(X 与 Y)的行,将这些称为“候选配对”
如果当前行是 X,请选择最小值。 v out the pair Candidates to become v_paired for the current row,如果当前行是Y,则选择最大值。 v 在候选对中成为当前行的 v_paired
提前致谢。
【问题讨论】:
【参考方案1】:我认为这应该按顺序进行... 第一个按桶分组
groups = df.groupby('bucket', group_keys=False)
此功能将应用于每个存储桶组
def func(group):
y_value = None
x_value = None
result = []
for _, (_, value_type, value) in group.iterrows():
if value_type == 'X':
x_value = max(filter(None,(x_value, value)))
result.append(y_value)
elif value_type == 'Y':
y_value = min(filter(None,(y_value, value)))
result.append(x_value)
return pd.DataFrame(result)
df['v_paired'] = groups.apply(func)
希望这能完成这项工作
【讨论】:
是的,但没有其他办法......因为你需要保持状态......你也在做 groupby 这将使事情变得更快,更容易阅读...... 如果没有更好的答案,你能接受我的回答吗 不,因为有更好的方法。以上是关于熊猫数据框 - 配对存储桶中的行的主要内容,如果未能解决你的问题,请参考以下文章
将谷歌存储桶中的所有 .csv 文件读取到一个大熊猫 df 中,然后以 .csv 格式保存到另一个桶中