我的DataFrame观察到错误,即日期不匹配,因为列是通过API无意中生成的日期和值对,如下所示:
data = {'Date.0': ['1/1/2022','1/2/2022', '1/3/2022','1/4/2022'], 'ABC Return': [11, 21, 31, 41], 'Date.1': ['1/1/2022','1/2/2022', '1/4/2022','1/5/2022'], 'XYZ Return': [12, 22, 42, 51] }
df = pd.DataFrame(data)
我想修复这个问题,使它们对齐,并用0(或NaN或其他值)填充缺失的值:
data = {'Date.0': ['1/1/2022','1/2/2022', '1/3/2022','1/4/2022','1/5/2022'], 'ABC Return': [11, 21, 31, 41, np.NaN], 'Date.1': ['1/1/2022','1/2/2022', '1/3/2022', '1/4/2022','1/5/2022'], 'XYZ Return': [12, 22, np.NaN, 42, 51]}
df = pd.DataFrame(data)
我有大约60个变量,但我还没有想出一个可伸缩的解决方案(除了在Excel中手动合并它们之外).如有任何帮助,我们不胜感激.
编辑:请注意,Value列没有系统的模式(除了结尾是相同的"xxx Return")(我已经将它从var1和var2更改为ABC和XYZ.)日期是有编号的,因此确实有一个模式,但略有不同,我已经更新了这个(而不是data_var1,现在是Date.0,Date.1等).
由于我的专栏名称已更改,因此Nick提供的以下解决方案有效,稍作修改:
# get a list of var names
ticker_list = [col for col in df.columns if col.endswith('Return')]
dates = pd.DataFrame(pd.concat([df[f'Date.{v}'] for v in range(2)]).unique()).set_index(0)
date_counter = 0
dfs = list()
for v in tickers:
dfs.append(dates.join(df[[f'Date.{date_counter}', v]].set_index(f'Date.{date_counter}')).fillna(np.NaN))
date_counter = date_counter + 1
out = pd.concat(dfs, axis=1).reset_index(names='date')