我的数据是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()
答案 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 = 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('list')
# {'ID_1': [-950.0, -5160.0], 'ID_2': [-5954.0, -1403.0], 'ID_4': [nan, -14.0], 'ID_5': [-64430.0, -16281.0]}