[英]How do I iteratively select rows in pandas based on column values?
我是 pandas 的新手,所以更簡單(盡管可能不是最有效或最優雅)的解決方案值得贊賞。 如果我能更好地理解答案,我不介意有點蠻力。
如果我有以下數據框:
A B C
0 0 1
0 1 1
我想按順序遍歷列“A”、“B”和“C”,並在每次迭代期間選擇當前列為“1”的所有行,並且之前的列都不是,並保存結果在下一次迭代中使用它。
因此,在查看 A 列時,我不會選擇任何內容。 然后在查看 BI 列時會選擇第二行,因為 B==1 和 A==0。 然后在查看 CI 列時會選擇第一行,因為 A==0 和 B==0。
創建一個布爾掩碼:
m = (df == 1) & (df.cumsum(axis=1) == 1)
d = {col: df[m[col]].index.tolist() for col in df.columns if m[col].sum()}
輸出:
>>> m
A B C
0 False False True
1 False True False
2 False False True
>>> d
{'B': [1], 'C': [0, 2]}
我稍微修改了您的數據框:
>>> df
A B C
0 0 0 1
1 0 1 1
2 0 0 1
更新
對於我的樣本的預期輸出:
for rows, col in zip(m, df.columns):
if m[col].sum():
print(f"\n=== {col} ===")
print(df[m[col]])
輸出:
=== B ===
A B C
1 0 1 1
=== C ===
A B C
0 0 0 1
2 0 0 1
好像你需要直接使用idxmax
返回請求軸上第一次出現最大值的索引。
NA/空值被排除在外。
>>> df.idxmax()
A 0
B 1
C 0
dtype: int64
上面的值是滿足您的約束的索引。 B
的1
表示第二行被“選中”。 0
代表 C,相同。 唯一的問題是,如果什么也沒找到,它也會返回0
。
為了解決這個問題,您可以使用where
>>> df.idxmax().where(~df.eq(0).all())
這將確保為全零列返回NaN
。
A NaN
B 1.0
C 0.0
dtype: float64
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.