在Pandas Dataframe中填充缺失值并结合合并

nkoocmlb  于 2023-04-28  发布在  其他
关注(0)|答案(2)|浏览(127)

我的dataframe有未对齐的观察,也就是日期不匹配,因为列是通过API生成的日期和值对,如下所示:

data = {'date_var1': ['1/1/2022','1/2/2022', '1/3/2022','1/4/2022'], 'var1': [11, 21, 31, 41], 'date_var2': ['1/1/2022','1/2/2022', '1/4/2022','1/5/2022'], 'var2': [12, 22, 42, 51] }
df = pd.DataFrame(data)

我想解决这个问题,让它们对齐,并用0(或NaN或其他东西)填充缺失值:

data = {'date_var1': ['1/1/2022','1/2/2022', '1/3/2022','1/4/2022','1/5/2022'], 'var1': [11, 21, 31, 41, np.NaN], 'date_var2': ['1/1/2022','1/2/2022', '1/3/2022', '1/4/2022','1/5/2022'], 'var2': [12, 22, np.NaN, 42, 51]}
df = pd.DataFrame(data)

我有大约60个变量,我还没能想出一个可扩展的解决方案(除了在Excel中手工合并它们)。

dhxwm5r4

dhxwm5r41#

这里有一种方法可以做到这一点(依赖于问题中的列命名方案,如果真实的的 Dataframe 不使用这些名称,则需要进行调整):

# get a list of var names
vars = [col for col in df.columns if col.startswith('var')]
# make a dataframe with all the unique dates as its index
dates = pd.DataFrame(pd.concat([df[f'date_{v}'] for v in vars]).unique()).set_index(0)
# extract each of the date_var* and var* columns to a separate df
# and join to the list of dates, filling na with 0
dfs = [dates.join(df[[f'date_{v}', v]].set_index(f'date_{v}')).fillna(0) for v in vars]
# concatenate all the dfs together and reset the index
out = pd.concat(dfs, axis=1).reset_index(names='date')

输出(用于示例数据):

date  var1  var2
0  1/1/2022  11.0  12.0
1  1/2/2022  21.0  22.0
2  1/3/2022  31.0   0.0
3  1/4/2022  41.0  42.0
4  1/5/2022   0.0  51.0
ru9i0ody

ru9i0ody2#

示例

data = {'date_var1': ['1/1/2022','1/2/2022', '1/3/2022','1/4/2022'], 'var1': [11, 21, 31, 41], 'date_var2': ['1/1/2022','1/2/2022', '1/4/2022','1/5/2022'], 'var2': [12, 22, 42, 51] }
df = pd.DataFrame(data)

df

date_var1   var1    date_var2   var2
0   1/1/2022    11      1/1/2022    12
1   1/2/2022    21      1/2/2022    22
2   1/3/2022    31      1/4/2022    42
3   1/4/2022    41      1/5/2022    51

编码

使用pd.wide_to_long

df1 = (pd.wide_to_long(df.reset_index(), ['date_var', 'var'], i='index', j='')
.reset_index().pivot_table('var', index='date_var', columns='')
.add_prefix('var').fillna(0))

df1

var1    var2
date_var        
1/1/2022    11.0    12.0
1/2/2022    21.0    22.0
1/3/2022    31.0    0.0
1/4/2022    41.0    42.0
1/5/2022    0.0     51.0

创建'date_var#'列并像df一样对齐

n=2
(df1
 .assign(**{'date_var{}'.format(i + 1) : df1.index for i in range(n)})
 .reset_index(drop=True)
 .reindex(columns=df.columns))

output

date_var1   var1    date_var2   var2
0   1/1/2022    11.0    1/1/2022    12.0
1   1/2/2022    21.0    1/2/2022    22.0
2   1/3/2022    31.0    1/3/2022    0.0
3   1/4/2022    41.0    1/4/2022    42.0
4   1/5/2022    0.0     1/5/2022    51.0

相关问题