我有一個資料框:
ColA ColB ColC
a 0 1
b 3 3
c 1 1
a 0 1
a 1 2
b 3 3
在根據列中的值進行過濾時,我需要識別具有不同值的每一行。示例:當我在 ColA 中過濾值為“a”的資料框時,第 5 行在 ColB 和 ColC 中具有不同的值。
我試過了
df['result']=df['ColA'].ne(df['ColA'].shift().bfill()).astype(int)
這導致:
| 可樂 | ColB | 科爾C | 結果 |
|---|---|---|---|
| 一個 | 0 | 1 | 0 |
| b | 3 | 3 | 1 |
| C | 1 | 1 | 1 |
| 一個 | 0 | 1 | 1 |
| 一個 | 1 | 2 | 1 |
| b | 3 | 3 | 1 |
我需要的是(過濾值'a'應該識別其他列中具有不同值的行):
| 可樂 | ColB | 科爾C | 結果 |
|---|---|---|---|
| 一個 | 0 | 1 | 0 |
| b | 3 | 3 | 1 |
| C | 1 | 1 | 1 |
| 一個 | 0 | 1 | 0 |
| 一個 | 1 | 2 | 1 |
| b | 3 | 3 | 1 |
如果我使用 groupby 方法:
df.groupby(df.columns.tolist())['ColA'].nunique()
它僅適用于具有幾種資料型別的小型資料幀。
uj5u.com熱心網友回復:
如果我理解正確,您可以drop_duplicates然后創建結果列,groupby并cumcount獲取每個組的每個唯一行的識別符號。
print(df.drop_duplicates(subset=['ColA','ColB','ColC'])
.assign(result=lambda x: x.groupby('ColA').cumcount()))
# ColA ColB ColC result
# 0 a 0 1 0
# 1 b 3 3 0
# 2 c 1 1 0
# 4 a 1 2 1
如您所見,您從原始 df 中“丟失了行”,因此merge它回傳到 df。
df = (
df.merge(df.drop_duplicates(subset=['ColA','ColB','ColC'])
.assign(result=lambda x: x.groupby('ColA').cumcount()),
how='left')
)
print(df)
# ColA ColB ColC result
# 0 a 0 1 0
# 1 b 3 3 0
# 2 c 1 1 0
# 3 a 0 1 0
# 4 a 1 2 1
# 5 b 3 3 0
uj5u.com熱心網友回復:
最快的方法是洗掉重復的行并根據索引drop_duplicates(keep=False)創建列。result
data = {
'ColA': ['a', 'b', 'c', 'a', 'a', 'b'],
'ColB': [0, 3, 1, 0, 1, 3],
'ColC': [1, 3, 1, 1, 2, 3]
}
df = pd.DataFrame(data)
unique_rows = df.drop_duplicates(keep=False)
df['result'] = df.index.isin(unique_rows.index).astype(int)
print(df)
uj5u.com熱心網友回復:
如果您只想擁有一個唯一的 id,pd.factorize請在整個資料框上使用,而不使用groupby:
df['result'] = pd.factorize(df.agg(tuple, axis=1))[0]
print(df)
# Output
ColA ColB ColC result
0 a 0 1 0
1 b 3 3 1
2 c 1 1 2
3 a 0 1 0
4 a 1 2 3
5 b 3 3 1
您可以使用duplicated:
df['result'] = (~df.duplicated(keep=False)).astype(int)
print(df)
# Output
ColA ColB ColC result
0 a 0 1 0
1 b 3 3 0
2 c 1 1 1
3 a 0 1 0
4 a 1 2 1
5 b 3 3 0
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/419884.html
標籤:
