![](/img/trans.png)
[英]Collect values of pandas dataframe column A if column B is NaN (Python)
[英]Pandas Dataframe replace NaN values of column A with values from column B
我有以下 DataFrame 是我在合並兩個 df 后得到的:
一種 | 乙 | C_x | D_x | C_y | D_y |
---|---|---|---|---|---|
0 | 1136006640 | NaT | NaT | 2022-11-18 | 2022-11-24 |
1個 | 1136030941 | NaT | NaT | 2022-11-30 | 2022-12-09 |
3個 | 1136051543 | 2022-11-25 | 2022-12-16 | NaT | NaT |
4個 | 1136072241 | NaT | NaT | 2022-12-20 | 2022-12-29 |
如何加入 C 和 D 列,以便將 NaT 值替換為日期。 如果 _x 列有數據,則 _y 列始終為 NaT,反之亦然。 我可以在合並時解決這個問題,還是必須在之后解決?
下面的代碼構造新列C_z
、 D_z
。 為此,它從C_y
和D_y
列復制日期。 如果兩列中的特定行都沒有日期,它會從C_x
、 D_x
復制日期。
import pandas as pd
import numpy as np
from io import StringIO
# setup sample data
data = """
A;B;C_x;D_x;C_y;D_y
0;1136006640;NaT;NaT;2022-11-18;2022-11-24
1;1136030941;NaT;NaT;2022-11-30;2022-12-09
3;1136051543;2022-11-25;2022-12-16;NaT;NaT
4;1136072241;NaT;NaT;2022-12-20;2022-12-29
"""
df = pd.read_csv(StringIO(data), sep=';', parse_dates=['C_x','D_x','C_y','D_y'])
# copy `C_y`,`D_y`
df[['C_z','D_z']] = df[['C_y','D_y']]
# combine dates
mask = df[['C_y','D_y']].isnull().all(axis=1)
df.loc[mask,'C_z'] = df['C_x']
df.loc[mask,'D_z'] = df['D_x']
結果:
A B C_x D_x C_y D_y C_z D_z
0 0 1136006640 NaT NaT 2022-11-18 2022-11-24 2022-11-18 2022-11-24
1 1 1136030941 NaT NaT 2022-11-30 2022-12-09 2022-11-30 2022-12-09
2 3 1136051543 2022-11-25 2022-12-16 NaT NaT 2022-11-25 2022-12-16
3 4 1136072241 NaT NaT 2022-12-20 2022-12-29 2022-12-20 2022-12-29
使用DataFrame.combine_first
刪除相同列名稱的后綴:
df1 = df.filter(regex='_x$').rename(columns=lambda x: x.replace('_x',''))
df2 = df.filter(regex='_y$').rename(columns=lambda x: x.replace('_y',''))
df = df.join(df1.combine_first(df2))
print (df)
A B C_x D_x C_y D_y C \
0 0 1136006640 NaT NaT 2022-11-18 2022-11-24 2022-11-18
1 1 1136030941 NaT NaT 2022-11-30 2022-12-09 2022-11-30
2 3 1136051543 2022-11-25 2022-12-16 NaT NaT 2022-11-25
3 4 1136072241 NaT NaT 2022-12-20 2022-12-29 2022-12-20
D
0 2022-11-24
1 2022-12-09
2 2022-12-16
3 2022-12-29
如果輸入數據是這樣的:
print (df1)
B C D
0 1136051543 2022-11-25 2022-12-16
print (df2)
B C D
0 1136006640 2022-11-18 2022-11-24
1 1136030941 2022-11-30 2022-12-09
2 1136072241 2022-12-20 2022-12-29
然后改為使用concat
merge
(如果df1.index
不存在於df2.index
中,那么merge
創建缺失值,就像有問題的那樣):
df = pd.concat([df1, df2]).sort_values('B', ignore_index=True)
print (df)
B C D
0 1136006640 2022-11-18 2022-11-24
1 1136030941 2022-11-30 2022-12-09
2 1136051543 2022-11-25 2022-12-16
3 1136072241 2022-12-20 2022-12-29
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.