我有一个这样的示例df,我想按日期,ID和ID_BB_GLOBAL分开,并添加列"日期"在每个表上使用各自的日期,并创建一个格式为"ID,ID_BB_GLOBAL, date"的CSV文件。列。有人知道怎么做吗,熊猫?
https://i.stack.imgur.com/pznsM.png
> 0 2020-01-31 00:00:00 NaN 2020-02-28 00:00:00 ... NaN 2020-12-31 00:00:00 NaN
3 ID ID_BB_GLOBAL().value ID ... ID_BB_GLOBAL().value ID ID_BB_GLOBAL().value
4 A UN Equity BBG000C2V541 A UN Equity ... BBG00Y2JBWP1 A UN Equity BBG000C2V541
5 AAL UW Equity BBG005P7Q8V5 AAL UW Equity ... BBG000C2V541 AAL UW Equity BBG005P7Q8V5
6 AAP UN Equity BBG000F7RFH6 AAP UN Equity ... BBG005P7Q8V5 AAP UN Equity BBG000F7RFH6
7 AAPL UW Equity BBG000B9Y5X2 AAPL UW Equity ... BBG000F7RFH6 AAPL UW Equity BBG000B9Y5X2
对于我的测试,我使用了从您的数据中提取的内容(nan
当然是np.nan
):
pd.DataFrame([['2020-01-31 00:00:00', nan, '2020-02-28 00:00:00', nan,
'2020-12-31 00:00:00', nan],
['ID', 'ID_BB_GLOBAL().value', 'ID', 'ID_BB_GLOBAL().value',
'ID', 'ID_BB_GLOBAL().value'],
['A UN Equity', 'BBG000C2V541', 'A UN Equity', 'BBG00Y2JBWP1',
'A UN Equity', 'BBG000C2V541'],
['AAL UW Equity', 'BBG005P7Q8V5', 'AAL UW Equity',
'BBG000C2V541', 'AAL UW Equity', 'BBG005P7Q8V5'],
['AAP UN Equity', 'BBG000F7RFH6', 'AAP UN Equity',
'BBG005P7Q8V5', 'AAP UN Equity', 'BBG000F7RFH6'],
['AAPL UW Equity', 'BBG000B9Y5X2', 'AAPL UW Equity',
'BBG000F7RFH6', 'AAPL UW Equity', 'BBG000B9Y5X2']],
index=[0, 3, 4, 5, 6, 7])
它看起来像:
1 2 3 4 5 6
0 2020-01-31 00:00:00 NaN 2020-02-28 00:00:00 NaN 2020-12-31 00:00:00 NaN
3 ID ID_BB_GLOBAL().value ID ID_BB_GLOBAL().value ID ID_BB_GLOBAL().value
4 A UN Equity BBG000C2V541 A UN Equity BBG00Y2JBWP1 A UN Equity BBG000C2V541
5 AAL UW Equity BBG005P7Q8V5 AAL UW Equity BBG000C2V541 AAL UW Equity BBG005P7Q8V5
6 AAP UN Equity BBG000F7RFH6 AAP UN Equity BBG005P7Q8V5 AAP UN Equity BBG000F7RFH6
7 AAPL UW Equity BBG000B9Y5X2 AAPL UW Equity BBG000F7RFH6 AAPL UW Equity BBG000B9Y5X2
实际上,它不能用作数据框,因为并非所有行都包含一致的数据:
- 第一个包含日期
- 第二个包含看起来像列名的内容
- 只有其他的包含实际数据
我将首先从第二行输入正确的列名,然后将数据帧分成两列。在每个项目上,我将使用第一个单元格中的日期添加一个日期列,并删除前两行。完成后,我将连接所有项并设置一个新索引。
在Pandas中,它可以是:
# set the columns from the second row
df.columns = df.iloc[1]
df = df.rename_axis(columns=None, index=None)
# split the dataframe by sets of 2 columns,adding each a date column from the
# first cell and dropping the first 2 rows
dfs = [df.iloc[:, i:i+2].assign(date=pd.to_datetime(df.iloc[0, i])).iloc[2:]
for i in range(0, len(df.columns), 2)]
# control the first item
print(dfs[0])
# concat the sub-frames
new_df = pd.concat(dfs, ignore_index=True)
第一项是:
ID ID_BB_GLOBAL().value date
4 A UN Equity BBG000C2V541 2020-01-31
5 AAL UW Equity BBG005P7Q8V5 2020-01-31
6 AAP UN Equity BBG000F7RFH6 2020-01-31
7 AAPL UW Equity BBG000B9Y5X2 2020-01-31
嗯,看起来不错…
,最终数据帧为:
ID ID_BB_GLOBAL().value date
0 A UN Equity BBG000C2V541 2020-01-31
1 AAL UW Equity BBG005P7Q8V5 2020-01-31
2 AAP UN Equity BBG000F7RFH6 2020-01-31
3 AAPL UW Equity BBG000B9Y5X2 2020-01-31
4 A UN Equity BBG00Y2JBWP1 2020-02-28
5 AAL UW Equity BBG000C2V541 2020-02-28
6 AAP UN Equity BBG005P7Q8V5 2020-02-28
7 AAPL UW Equity BBG000F7RFH6 2020-02-28
8 A UN Equity BBG000C2V541 2020-12-31
9 AAL UW Equity BBG005P7Q8V5 2020-12-31
10 AAP UN Equity BBG000F7RFH6 2020-12-31
11 AAPL UW Equity BBG000B9Y5X2 2020-12-31