我是 pandas 的新手,在根据其他列中的值从 DF 中选择值时遇到问题。 以下是我的数据框:
C1 C2 C3 C4
0 1234 1002 Operational ABC
1 5678 2001 Closed ABC
2 7896 1002 Operational DEF
3 4321 4005 Closed CDE
4 7781 4005 Operational ABC
Q1。我想在 C2 中选择 C3 值为“操作”的重复值。 输出数据帧应该是
C1 C2 C3 C4
1234 1002 Operational ABC
7896 1002 Operational ABC
我尝试过 df[(df.duplicate(['C2'], keep=False)) & df['C3'] == 'Operational'] 但它选择索引为 0,2,4 的行。但我只想将索引为 0 和 2 的行作为输出。
第二季度。如何为 C4 中的每个不同值选择一行。 输出数据帧应该是
C1 C2 C3 C4
7896 1002 Operational DEF
4321 4005 Closed CDE
7781 4005 Operational ABC
我可以获得有关这两个自定义选择的任何建议吗?
最佳答案
第一个解决方案更容易过滤两次 - 首先仅操作
,然后重复
:
df1 = df[df['C3'] == 'Operational']
df1 = df1[df1.duplicated(['C2'], keep=False)]
print (df1)
C1 C2 C3 C4
0 1234 1002 Operational ABC
2 7896 1002 Operational DEF
什么是相同的,但可读性较差:
m1 = df['C3'] == 'Operational'
df1 = df[df[m1].duplicated(['C2'], keep=False) & m1]
print (df1)
C1 C2 C3 C4
0 1234 1002 Operational ABC
2 7896 1002 Operational DEF
对于第二个问题,请使用 drop_duplicates
使用参数 keep='last'
获取 C4
中重复项的最后一个值:
df2 = df.drop_duplicates('C4', keep='last')
print (df2)
C1 C2 C3 C4
2 7896 1002 Operational DEF
3 4321 4005 Closed CDE
4 7781 4005 Operational ABC
或者,如果有必要,仅删除连续的重复项:
mask = df['C4'].ne(df['C4'].shift()).cumsum().duplicated(keep=False)
df2 = df[~mask]
print (df2)
C1 C2 C3 C4
2 7896 1002 Operational DEF
3 4321 4005 Closed CDE
4 7781 4005 Operational ABC
关于python - 如何根据其他列中的值选择 pandas 数据框中的行以及如何为特定列中的每个不同值选择一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47434557/