簡體   English   中英

復制 pandas dataframe 中的每一行,並根據列表更改某些列的值

[英]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_bval_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 ,這樣你就可以mapexplode ,最后重建 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.

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