如何在Python Pandas中的数据框中,基于其他2列中的值组在3列中填充NaN值,并在其余列中保留未触及的值?

weylhg0b  于 2023-11-15  发布在  Python
关注(0)|答案(2)|浏览(100)

我在Python Pandas中有一个Data Frame,如下所示:

data = [
    (1, None, None, None, '2023-01-10', None, None),
    (1, None, None, None, '2023-01-10', 1, 0),
    (1, 9, 0, 0.55, '2023-01-10', 15, None),
    (2, None, None, None, '2023-11-22', 2, 1),
    (2, 88, 1, 0.68, '2023-11-22', 103, 8)
]

df = pd.DataFrame(data, columns=['id', 'col1', 'col2', 'col3', 'col_date', 'col4', 'col5'])
df

字符串


的数据
我需要为列中的每组值:id,col_date(数据类型datetime)填充列中的值:col1,col2,col3。对于列中的每组值:id,col_date至少有一行的值:col1,col2,col3,我需要为每个提到的组填充其余的行。
列中的值:col4,col5(以及本例中未包括的其他列)保持不变。
因此,我需要下面这样的东西:

data = [
    (1, 9, 0, 0.55, '2023-01-10', None, None),
    (1, 9, 0, 0.55, '2023-01-10', 1, 0),
    (1, 9, 0, 0.55, '2023-01-10', 15, None),
    (2, 88, 1, 0.68, '2023-11-22', 2, 1),
    (2, 88, 1, 0.68, '2023-11-22', 103, 8)
]

df = pd.DataFrame(data, columns=['id', 'col1', 'col2', 'col3', 'col_date', 'col4', 'col5'])
df



如何在Python Pandas中做到这一点?

rryofs0p

rryofs0p1#

您仍然可以使用my previous answer,但在groupbytransform之间选择所需的列:

>>> df.fillna(df.groupby(['id', 'col_date'])[['col1', 'col2', 'col3']]
                .transform('max'))
   id  col1  col2  col3    col_date   col4  col5
0   1   9.0   0.0  0.55  2023-01-10    NaN   NaN
1   1   9.0   0.0  0.55  2023-01-10    1.0   0.0
2   1   9.0   0.0  0.55  2023-01-10   15.0   NaN
3   2  88.0   1.0  0.68  2023-11-22    2.0   1.0
4   2  88.0   1.0  0.68  2023-11-22  103.0   8.0

字符串
max仅在dtype为数字时有效。如果不是,您可以使用自定义函数。将'max'替换为lambda x: x.dropna().squeeze()lambda x: x.ffill().bfill()

>>> df.dtypes
id            int64
col1         object
col2        float64
col3         object
col_date     object
col4        float64
col5        float64
dtype: object

>>> df.fillna(df.groupby(['id', 'col_date'])[['col1', 'col2', 'col3']]
                .transform(lambda x: x.ffill().bfill()))
   id  col1  col2  col3    col_date   col4  col5
0   1   9.0   0.0  0.55  2023-01-10    NaN   NaN
1   1   9.0   0.0  0.55  2023-01-10    1.0   0.0
2   1   9.0   0.0  0.55  2023-01-10   15.0   NaN
3   2  88.0   1.0  0.68  2023-11-22    2.0   1.0
4   2  88.0   1.0  0.68  2023-11-22  103.0   8.0

but5z9lq

but5z9lq2#

看看你是否可以尝试一下。基本上,下面的代码片段将datrame合并到自身(在保留非nan行之后)。注意,df2将只包含所有三列(col1,col2和col3)都具有非空值的行。

df2=df[['id','col_date','col1','col2','col3']].copy(deep=True)
df2 = df2[df[['col1','col2','col3']].notnull().all(1)]
final=df.merge(df2,on=['id','col_date'],how='inner')
final=final[['id','col1_y','col2_y','col3_y','col_date','col4','col5']].rename(columns={'col1_y':'col1','col2_y':'col2','col3_y':'col3'})

字符串

相关问题