通过从熊猫数据框中的索引创建字典

时间:2020-02-20 20:55:25

标签: python pandas dataframe datetime dictionary

example of my data

我的数据是200列ID,其值是10年。我只对每月值感兴趣,因此我将month列分配为dataframe索引,并删除了date列。我想创建一个以ID为键的字典,每个ID内有12个月,每个月的第一个非零值。像这样[ID] [MONTH] =值

这是我到目前为止所拥有的。我在遍历数据框并按索引将值分配给字典时遇到麻烦。

 IDdict=dict()


    df = pd.read_csv('data.csv')
    df.drop(['DATE'], axis=1, inplace=True)
    df = df.set_index(['Month'])

   IDs =[]
    IDs = list(df.columns)

    for ID in IDs:
        IDdict[ID]=dict()

2 个答案:

答案 0 :(得分:0)

months =所有月份的列表

for ID in IDs:
    IDdict = dict()
    for month in months:
        IDdict[month] = df[(df["Month"]==month)&(df[ID]!=0)].index[0]

答案 1 :(得分:0)

我建议为索引而不是月份名称使用数字值。这样,数据透视表将更易于按索引排序。

df = pd.DataFrame(
    [
        ('1/1/2014', 1, -950, -5954, 0, 0, -64430),
        ('1/1/2015', 1, 0, -5084, 0, 0, -29896),
        ('2/1/1995', 2, -5160, -1403, 0, 0, -16281),
        ('2/1/1996', 2, 0, -1573, 0, -14, -30772),
    ],
    columns=['Date', 'Month', 'ID_1', 'ID_2', 'ID_3', 'ID_4', 'ID_5']
)
#        Date  Month  ID_1  ID_2  ID_3  ID_4   ID_5
# 0  1/1/2014      1  -950 -5954     0     0 -64430
# 1  1/1/2015      1     0 -5084     0     0 -29896
# 2  2/1/1995      2 -5160 -1403     0     0 -16281
# 3  2/1/1996      2     0 -1573     0   -14 -30772

使用pd.melt

将数据转换为长格式
df = df.melt(id_vars=['Date', 'Month'], var_name='ID')
#        Date  Month    ID  value
# 0  1/1/2014      1  ID_1   -950
# 1  1/1/2015      1  ID_1      0
# 2  2/1/1995      2  ID_1  -5160
# 3  2/1/1996      2  ID_1      0
# 4  1/1/2014      1  ID_2  -5954

丢弃所有零值

df = df[df.value != 0]
#        Date  Month    ID  value
# 0  1/1/2014      1  ID_1   -950
# 2  2/1/1995      2  ID_1  -5160
# 4  1/1/2014      1  ID_2  -5954
# 5  1/1/2015      1  ID_2  -5084
# 6  2/1/1995      2  ID_2  -1403

按月份和ID分组,并获得第一行

df = df.groupby(['Month', 'ID']).first().reset_index()
#    Month    ID      Date  value
# 0      1  ID_1  1/1/2014   -950
# 1      1  ID_2  1/1/2014  -5954
# 2      1  ID_5  1/1/2014 -64430
# 3      2  ID_1  2/1/1995  -5160
# 4      2  ID_2  2/1/1995  -1403
# 5      2  ID_4  2/1/1996    -14
# 6      2  ID_5  2/1/1995 -16281

使用df.pivot_table

将表旋转回宽格式,其中每一列都是一个月
df = df.pivot_table(index='Month', columns='ID', values='value')
# ID       ID_1    ID_2  ID_4     ID_5
# Month
# 1      -950.0 -5954.0   NaN -64430.0
# 2     -5160.0 -1403.0 -14.0 -16281.0

使用df.to_dict

将数据帧转换为字典
df.to_dict('list')
# {'ID_1': [-950.0, -5160.0], 'ID_2': [-5954.0, -1403.0], 'ID_4': [nan, -14.0], 'ID_5': [-64430.0, -16281.0]}