我不確定該怎么做...我有 1 列“狀態”和另一列“MultiID”。我正在嘗試洗掉所有具有相同 MultiID 的行,但前提是它包含狀態“B”。
import pandas as pd
# initialise data of lists.
data = {'Status':['A', 'B', 'A', 'C', 'C', 'A', 'B', 'A'],
'MultiID': [1, 1, 2, 2, 2, 3, 3, 3]}
# Create DataFrame
df = pd.DataFrame(data)
# Print the output.
print(df)
由于 MultiID 的 1 和 3 中有一個“B”,輸出應該是:
0 A 2
1 C 2
2 C 2
uj5u.com熱心網友回復:
這是一個簡短的解決方案:
new_df = df.groupby('MultiID').filter(lambda g: ~g['Status'].eq('B').any())
輸出:
>>> new_df
Status MultiID
2 A 2
3 C 2
4 C 2
uj5u.com熱心網友回復:
這是一種沒有groupby. 獲取行 where 的“MultiID” Status=="B",然后過濾沒有這些 MultiID 的行:
MultiIDs_w_Bs = df.loc[df['Status'].eq('B'), 'MultiID']
out = df[~df['MultiID'].isin(MultiIDs_w_Bs)]
輸出:
Status MultiID
2 A 2
3 C 2
4 C 2
uj5u.com熱心網友回復:
沒必要 groupby
out = df.loc[~df.MultiID.isin(df.loc[df.Status.eq('B'),'MultiID'])]
Out[169]:
Status MultiID
2 A 2
3 C 2
4 C 2
uj5u.com熱心網友回復:
groupby在根據您的條件過濾掉您的資料框之前使用。這里transform允許向組的每個成員廣播布爾結果。
out = df[df.groupby('MultiID')['Status'].transform(lambda x: all(x != 'B'))]
print(out)
# Output
Status MultiID
2 A 2
3 C 2
4 C 2
uj5u.com熱心網友回復:
嘗試:
df[~df['Status'].eq('B').groupby(df['MultiID']).transform('any')]
輸出:
Status MultiID
2 A 2
3 C 2
4 C 2
細節:
- 創建一個布爾序列,其中狀態等于 B。
- 按 MultiID 對該系列進行分組
- 如果該組中的任何記錄為真,則使用變換,使整個組為真
- 反轉真偽和布爾過濾原始資料幀
uj5u.com熱心網友回復:
s = ['A', 'B', 'A', 'C', 'C', 'A', 'B', 'A']
m = [1, 1, 2, 2, 2, 3, 3, 3]
# Loop through lists and remove the element if its status is B
for i in range(len(m)-1):
if s[i] == 'B':
del m[i]
# Remove all B's from s
while 'B' in s:
s.remove('B')
print(s)
print(m)
給
['A', 'A', 'C', 'C', 'A', 'A']
[1, 2, 2, 2, 3, 3]
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/422929.html
標籤:
