簡體   English   中英

如何根據列值迭代地選擇 pandas 中的行?

[英]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

上面的值是滿足您的約束的索引。 B1表示第二行被“選中”。 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM