当我通过tappers_df['TAP_REOPEN_SCHEDULE']
在笔记本中检查数据框时,数据框中的对象列看起来像这样>
Jupiter notebook image
数据框的索引由您可以在图像中看到的'Corp'字符串组成。 [[双括号]]中的“ TAP_REOPEN_SCHEDULE”列是日期,后跟金额。每个不同的“ Corp”索引项在列表中出现2到16次,并且在“ TAP_REOPEN_SCHEDULE”列中具有1到15个日期/金额对。因此,对于出现两次的“ Corp”索引项,该列的行看起来像这样:
- AF125751 Corp [[2015-07-17,5150.0]]
- AF125751 Corp [[2015-07-17,5150.0]]
对于出现三遍的“ Corp”索引项,行如下所示:
- AL997424 Corp [[2017-06-01,1632000.0],[2017-12-07,1065000]]
- AL997424 Corp [[2017-06-01,1632000.0],[2017-12-07,1065000]]
- AL997424 Corp [[2017-06-01,1632000.0],[2017-12-07,1065000]]
依此类推。对于每个“ Corp”索引项的第一个实例,我正在从数据框中的其他列中获取所需的日期和数量。对于后续的内容,我尝试将此列拆分为各个组成部分,以使结果看起来像这样(注意:我在这里仅将'|'用作两列之间的视觉分界)] >
我在数据框中有一列对象,当我通过tappers_df ['TAP_REOPEN_SCHEDULE'在我的笔记本中对其进行检查时,看起来像这样,它看起来像木星笔记本图像。
这对您有用吗?
import pandas as pd
df_dict = {'index': ['AF125751 Corp', 'AL997424 Corp', 'AL997424 Corp'],
'TAP_REOPEN_SCHEDULE': [[['2015-07-17', 5150.0]], [['2017-06-01', 1632000.0], ['2017-12-07', 1065000]],
[['2017-06-01', 1632000.0], ['2017-12-07', 1065000]]]}
df = pd.DataFrame.from_dict(df_dict).set_index('index')
s = df.apply(lambda d: pd.Series(d['TAP_REOPEN_SCHEDULE']), axis=1).stack().reset_index(level=1, drop=True)
df_split = pd.DataFrame(s, columns=['TAP_REOPEN_SCHEDULE'])
pd.DataFrame(df_split['TAP_REOPEN_SCHEDULE'].values.tolist(), columns=['DATE', 'VALUE'], index=df_split.index)
代码从每个嵌套列表中创建一个Series(每个Series行是一个[日期,值]对),堆叠这些Series,然后重置在堆叠过程中创建的MultiIndex。这将产生一个Series对象。接下来,它重新创建一个DataFrame对象,该对象与您刚开始时使用的对象相似。
顺便说一句,您还可以通过运行以下命令删除重复的行:
df[~df.index.duplicated()]['TAP_REOPEN_SCHEDULE']
import pandas as pd
df_dict = {'index': ['AF125751 Corp', 'AL997424 Corp', 'AL997424 Corp'],
'TAP_REOPEN_SCHEDULE': [[['2015-07-17', 5150.0]], [['2017-06-01', 1632000.0], ['2017-12-07', 1065000]],
[['2017-06-01', 1632000.0], ['2017-12-07', 1065000]]]}
df = pd.DataFrame.from_dict(df_dict).set_index('index')
s = df.apply(lambda d: pd.Series(d['TAP_REOPEN_SCHEDULE']), axis=1).stack().reset_index(level=1, drop=True)
df_split = pd.DataFrame(s, columns=['TAP_REOPEN_SCHEDULE'])
pd.DataFrame(df_split['TAP_REOPEN_SCHEDULE'].values.tolist(), columns=['DATE', 'VALUE'], index=df_split.index)