我有一个这样的数据框:
id other_id_1 other_id_2 other_id_3
1 100 101 102
2 200 201 202
3 300 301 302
我想要这个:
id other_id
1 100
1 101
1 102
2 200
2 201
2 202
3 300
3 301
3 302
我可以像这样轻松获得所需的输出:
to_keep = {}
for idx in df.index:
identifier = df.loc[idx]['id']
to_keep[identifier] = []
for col in ['other_id_1', 'other_id_2', 'other_id_3']:
row_val = df.loc[idx][col]
to_keep[identifier].append(row_val)
这给了我这个:
{1: [100, 101, 102], 2: [200, 201, 202], 3: [300, 301, 302]}
我可以轻松地将其写入文件。然而,我正在努力在本地熊猫中做到这一点。我会想象这种看似转换会更直接,但我正在努力......
答案 0 :(得分:2)
好吧,如果您还没有,请将id
设置为索引:
>>> df
id other_id_1 other_id_2 other_id_3
0 1 100 101 102
1 2 200 201 202
2 3 300 301 302
>>> df.set_index('id', inplace=True)
>>> df
other_id_1 other_id_2 other_id_3
id
1 100 101 102
2 200 201 202
3 300 301 302
然后,您只需使用pd.concat
:
>>> df = pd.concat([df[col] for col in df])
>>> df
id
1 100
2 200
3 300
1 101
2 201
3 301
1 102
2 202
3 302
dtype: int64
如果您需要排序的值:
>>> df.sort_values()
id
1 100
1 101
1 102
2 200
2 201
2 202
3 300
3 301
3 302
dtype: int64
>>>
答案 1 :(得分:2)
pd.wide_to_long(df,'other_id_',i='id',j='drop').reset_index().drop('drop',axis=1).sort_values('id')
Out[36]:
id other_id_
0 1 100
3 1 101
6 1 102
1 2 200
4 2 201
7 2 202
2 3 300
5 3 301
8 3 302
或unstack
df.set_index('id').unstack().reset_index().drop('level_0',1).rename(columns={0:'other_id'})
Out[43]:
id other_id
0 1 100
1 2 200
2 3 300
3 1 101
4 2 201
5 3 301
6 1 102
7 2 202
8 3 302
答案 2 :(得分:1)
如果grid-row-end
不是索引,请先将其设置为:
id
现在,调用df = df.set_index('id')
df
other_id_1 other_id_2 other_id_3
id
1 100 101 102
2 200 201 202
3 300 301 302
构造函数。您必须使用pd.DataFrame
平铺索引。
np.repeat
答案 3 :(得分:1)
还有一个(或更确切地说是两个):)
pd.melt(df, id_vars='id', value_vars=['other_id_1', 'other_id_2', 'other_id_3'], value_name='other_id')\
.drop('variable', 1).sort_values(by = 'id')
选项2:
df.set_index('id').stack().reset_index(1,drop = True).reset_index()\
.rename(columns = {0:'other_id'})
两种方式
id other_id
0 1 100
1 1 101
2 1 102
3 2 200
4 2 201
5 2 202
6 3 300
7 3 301
8 3 302