我有一个Pandas数据帧,由下面的数据帧表示:
A B C D
| 1 1 1 3 |
| 1 1 1 2 |
| 2 3 4 5 |我需要遍历这个数据框,查找A、B和C列中的值匹配的行,如果是真的,检查D列中的值是否为这些行,并删除具有较小值的行。所以,在上面的例子中,之后会是这样的。
A B C D
| 1 1 1 3 |
| 2 3 4 5 |我写了下面的代码,但是有些地方不对劲,导致了一个错误。它看起来也比它可能需要的更复杂,所以我想知道是否有更好、更简洁的方式来写这篇文章。
for col, row in df.iterrows():
... df1 = df.copy()
... df1.drop(col, inplace = True)
... for col1, row1 in df1.iterrows():
... if df[0].iloc[col] == df1[0].iloc[col1] & df[1].iloc[col] == df1[1].iloc[col1] &
df[2].iloc[col] == df1[2].iloc[col1] & df1[3].iloc[col1] > df[3].iloc[col]:
... df.drop(col, inplace = True)发布于 2021-01-09 00:28:02
如果存在多个唯一记录来获取必须保留的行的布尔索引,则可以按必须相等的所有变量进行分组(使用groupby(['A', 'B', 'C'])),然后排除D值最小的行(使用func)
def func(x):
if len(x.unique()) != 1:
return x != x.min()
else:
return x == x
df[df.groupby(['A', 'B', 'C'])['D'].apply(lambda x: func(x))]
A B C D
0 1 1 1 3
2 2 3 4 5如果必须保留在D中仅具有最大组值的行。然后你可以使用下面的代码:
df[df.groupby(['A', 'B', 'C'])['D'].apply(lambda x: x == x.max())]发布于 2021-01-09 00:42:18
这里有一个解决方案:
df[~((df[['A', 'B', 'C']].duplicated(keep=False)) & (df.groupby(['A', 'B', 'C'])['D'].transform(min)==df['D']))]解释:
df[['A', 'B', 'C']].duplicated(keep=False)返回具有'A‘、'B’、'C‘列的重复值的行的掩码
df.groupby(['A', 'B', 'C'])['D'].transform(min)==df['D']为“”A“”、“”B“”、“”C“”每组返回“”D“”列的最小值的行的掩码。“
这些掩码的组合选择了所有这些行(重复的'A','B','C‘和组的最小'D’。使用~,我们选择除了这些行之外的所有其他行。
所提供输入的结果:
A B C D
0 1 1 1 3
2 2 3 4 5https://stackoverflow.com/questions/65632568
复制相似问题