[英]Pandas replace rows based on multiple conditions
以下面的 dataframe 為例:
df = pd.DataFrame({"val":np.random.rand(8),
"id1":[1,2,3,4,1,2,3,4],
"id2":[1,2,1,2,2,1,2,2],
"id3":[1,1,1,1,2,2,2,2]})
我想用具有相同 id1 的相應 id2 值替換 id3 不等於任意引用的 id2 行
我有一個部分有效但不使用第二個條件的解決方案(當 id3 等於參考時,基於與 id1 相同的值替換 id2)。 這會阻止我的解決方案變得非常健壯,如下所述。
import pandas as pd
import numpy as np
df = pd.DataFrame({"val":np.random.rand(8),
"id1":[1,2,3,4,1,2,3,4],
"id2":[1,2,1,2,2,1,2,2],
"id3":[1,1,1,1,2,2,2,2]})
reference = 1
df.loc[df['id3'] != reference, "id2"] = df[df["id3"]==reference]["id2"].values
print(df)
Output:
val id1 id2 id3
0 0.580965 1 1 1
1 0.941297 2 2 1
2 0.001142 3 1 1
3 0.479363 4 2 1
4 0.732861 1 1 2
5 0.650075 2 2 2
6 0.776919 3 1 2
7 0.377657 4 2 2
此解決方案確實有效,但前提是 id3 具有兩個不同的值。 如果有三個id3值,即
df = pd.DataFrame({"val":np.random.rand(12),
"id1":[1,2,3,4,1,2,3,4,1,2,3,4],
"id2":[1,2,1,2,2,1,2,2,1,1,2,2],
"id3":[1,1,1,1,2,2,2,2,3,3,3,3]})
預期/期望 output:
val id1 id2 id3
0 0.800934 1 1 1
1 0.505645 2 2 1
2 0.268300 3 1 1
3 0.295300 4 2 1
4 0.564372 1 1 2
5 0.154572 2 2 2
6 0.591691 3 1 2
7 0.896055 4 2 2
8 0.275267 1 1 3
9 0.840533 2 2 3
10 0.192257 3 1 3
11 0.543342 4 2 3
然后不幸的是我的解決方案停止工作。 如果有人可以提供一些如何規避此問題的提示,我將不勝感激。
如果id1
列類似於組的計數器,則首先通過過濾和DataFrame.set_index
通過reference
組創建輔助Series
,然后使用Series.map
:
reference = 1
s = df[df['id3'] == reference].set_index('id1')['id2']
df['id2'] = df['id1'].map(s)
print (df)
val id1 id2 id3
0 0.986277 1 1 1
1 0.873392 2 2 1
2 0.509746 3 1 1
3 0.271836 4 2 1
4 0.336919 1 1 2
5 0.216954 2 2 2
6 0.276477 3 1 2
7 0.343316 4 2 2
8 0.862159 1 1 3
9 0.156700 2 2 3
10 0.140887 3 1 3
11 0.757080 4 2 3
如果不是計數器列,則通過GroupBy.cumcount
創建新的:
reference = 1
df['g'] = df.groupby('id3').cumcount()
s = df[df['id3'] == reference].set_index('g')['id2']
df['id2'] = df['g'].map(s)
print (df)
val id1 id2 id3 g
0 0.986277 1 1 1 0
1 0.873392 2 2 1 1
2 0.509746 3 1 1 2
3 0.271836 4 2 1 3
4 0.336919 1 1 2 0
5 0.216954 2 2 2 1
6 0.276477 3 1 2 2
7 0.343316 4 2 2 3
8 0.862159 1 1 3 0
9 0.156700 2 2 3 1
10 0.140887 3 1 3 2
11 0.757080 4 2 3 3
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.