![](/img/trans.png)
[英]Replicate row in Pandas dataframe based on condition and change values for a specific column
[英]Replicate each row in pandas dataframe and change values of some columns based on a list
假設我有這樣一個 pandas dataframe:
my_id val_a_b val_a val_c
0 id_1 rat|white rat 1
1 id_2 dog|brown dog 0
和這樣的列表:
val_a_list = ['rat', 'dog', 'cow']
我想多次復制每一行並根據 val_a_list 中的每個值替換val_a_b
和val_a
列中的值(除非val_a_list
中的值與val_a
中的元素val_a_list
),保持所有其他列的值相同.
所需 dataframe:
my_id val_a_b val_a val_c
0 id_1 rat|white rat 1
1 id_2 dog|brown dog 0
2 id_1 dog|white dog 1
3 id_1 cow|white cow 1
4 id_2 rat|brown rat 0
5 id_2 cow|brown cow 0
注意:第 2 行和第 3 行基於第 0 行,第 4 行和第 5 行基於第 1 行。
這是我的代碼,它遍歷每一行。 我正在尋找更好的解決方案:
def replicate_val_a_in_df(df, val_a_list):
df_base_size = df.shape[0]
for i in range(df_base_size):
for new_val_a in val_a_list:
val_a_b = df.iloc[i]['val_a_b']
val_a_b_parts = val_a_b.split('|')
original_val_a = val_a_b_parts[0]
if new_val_a != original_val_a:
val_b = val_a_b_parts[1]
new_val_a_b = "|".join([new_val_a, val_b])
df.append(df.iloc[i], ignore_index=True)
df.iloc[-1, df.columns.get_loc('val_a')] = new_val_a
df.iloc[-1, df.columns.get_loc('val_a_b')] = new_val_a_b
return df
我看過這個答案,但它在所有重復行中設置了相同的列值
IIUC 你可以創建一個dict
,這樣你就可以map
和explode
,最后重建 b 列:
d = {i: val_a_list for i in val_a_list}
df = df.assign(val_a=df["val_a"].map(d).fillna(df["val_a"])).explode("val_a")
df["val_a_b"] = df["val_a"]+"|"+df["val_a_b"].str.split("|").str[-1]
print (df)
my_id val_a_b val_a val_c
0 id_1 rat|white rat 1
0 id_1 dog|white dog 1
0 id_1 cow|white cow 1
1 id_2 rat|brown rat 0
1 id_2 dog|brown dog 0
1 id_2 cow|brown cow 0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.