[英]How to create a new rows from column values of pandas data frame
我有 dataframe 如下所示
輸入
Date Country Type Zip_Incl Zip_Excl
10/4/2020 FR Regional 57_67_68
2/1/2020 GB Regional AB_DD
17/3/2021 GB Regional BT_TY TS_TN
18/3/2021 GB Regional
19/1/2021 IN Regional 68
我需要根據以下條件轉換輸入:
1)如果 Zip_incl 不為空,則 Zip_incl 的值應傳遞給 Zip_Final
2)如果存在 Zip_incl 和 Zip_Excl 值,則 Zip_incl 的值應傳遞給 Zip_Final
3) 如果 Zip incl 為空並且存在 Zip_Excl 的值,則 Zip_Excl 應傳遞給 Zip_Final
Output
Date Country Type Zip_Incl Zip_Excl Zip_Final
10/4/2020 FR Regional 57 57
10/4/2020 FR Regional 67 67
10/4/2020 FR Regional 68 68
2/1/2020 GB Regional AB AB
2/1/2020 GB Regional DD DD
17/3/2021 GB Regional BT TS BT
17/3/2021 GB Regional TY TN TY
18/3/2021 GB Regional
19/1/2021 IN Regional 68 68
如何才能做到這一點?
在您的情況下,我們可以使用axis=1
進行bfill
然后split
字符串並explode
它
df['Zip_F']=df.filter(like='Zip').bfill(1).iloc[:,0].str.split('_')
df=df.explode('Zip_F')
df
Date Country Type Zip_Incl Zip_Excl Zip_F
0 10/4/2020 FR Regional 57_67_68 NaN 57
0 10/4/2020 FR Regional 57_67_68 NaN 67
0 10/4/2020 FR Regional 57_67_68 NaN 68
1 2/1/2020 GB Regional NaN AB_DD AB
1 2/1/2020 GB Regional NaN AB_DD DD
2 17/3/2021 GB Regional BT_TY TS_TN BT
2 17/3/2021 GB Regional BT_TY TS_TN TY
3 18/3/2021 GB Regional NaN NaN NaN
4 19/1/2021 IN Regional NaN 68 68
更新
df[['Zip_Incl','Zip_Excl']]=df[['Zip_Incl','Zip_Excl']].mask(df[['Zip_Incl','Zip_Excl']].notnull(),df.Zip_F,axis=0)
df
Out[178]:
Date Country Type Zip_Incl Zip_Excl Zip_F
0 10/4/2020 FR Regional 57 NaN 57
0 10/4/2020 FR Regional 67 NaN 67
0 10/4/2020 FR Regional 68 NaN 68
1 2/1/2020 GB Regional NaN AB AB
1 2/1/2020 GB Regional NaN DD DD
2 17/3/2021 GB Regional BT BT BT
2 17/3/2021 GB Regional TY TY TY
3 18/3/2021 GB Regional NaN NaN NaN
4 19/1/2021 IN Regional NaN 68 68
假設 dtypes 都是字符串,我會考慮以下
import pandas as pd
import numpy as np
df = pd.DataFrame({"Type":["Regional"]*5,
"Zip_Incl":["57_67_68", "", "BT_TY", "", ""],
"Zip_Excl":["","AB_DD", "TS_TN", "", "68"]})
# this tell us the element that are not ""
(~df[["Zip_Incl", "Zip_Excl"]].eq(""))
Zip_Incl Zip_Excl
0 True False
1 False True
2 True True
3 False False
4 False True
雖然以下返回每行中的第一個非空字符串
sel = (~df.eq("")).values.argmax(1)
現在通過一些numpy
技巧,我們可以獲得您的 output
mat = df[["Zip_Incl", "Zip_Excl"]].values
df["Zip_Final"] = mat[np.arange(mat.shape[0]), sel]
更新如果您的 df 不是那么大,並且您正在尋找不是 numpy 解決方案,您可以這樣做
def fun(row):
if row["Zip_Incl"] != "":
return row["Zip_Incl"]
elif row["Zip_Excl"] != "":
return row["Zip_Excl"]
else:
return ""
df["Zip_Final"] = df.apply(fun, axis=1)
在這兩種情況下,output 都是
Type Zip_Incl Zip_Excl Zip_Final
0 Regional 57_67_68 57_67_68
1 Regional AB_DD AB_DD
2 Regional BT_TY TS_TN BT_TY
3 Regional
4 Regional 68 68
Update2:我剛剛意識到您想將Zip_Final
拆分為不同的行。 使用以前的方法之一,您可以添加這些行
df["Zip_Final"] = df["Zip_Final"].str.split("_")
# you need pandas > 0 .25
df = df.explode("Zip_Final")
print(df)
Type Zip_Incl Zip_Excl Zip_Final
0 Regional 57_67_68 57
0 Regional 57_67_68 67
0 Regional 57_67_68 68
1 Regional AB_DD AB
1 Regional AB_DD DD
2 Regional BT_TY TS_TN BT
2 Regional BT_TY TS_TN TY
3 Regional
4 Regional 68 68
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.