我需要使用 Python 对任意数量的“项目”执行以下数据转换。前两列始终相同,然后可能有数千个“itemN”列,我希望将所有实际值放在一个新的单列中。
我尝试使用 pandas.wide_to_long 但据我所知,我会将新名称放入转置表中,如果项目数量发生变化,这将不起作用。
type rid item1 item2 item3
apple [81] 1.1 1.1 1.1
orange [82] 2.2 2.2 2.2
banana [41,42,43,52] 3.3 3.3 3.3
kiwi [90,95] 4.4 4.4 4.4
至
type rid gid value
apple [81] item1 1.1
apple [81] item2 1.1
apple [81] item3 1.1
orange [82] item1 2.2
orange [82] item2 2.2
orange [82] item3 2.2
banana [41,42,43,52] item1 3.3
banana [41,42,43,52] item2 3.3
banana [41,42,43,52] item3 3.3
kiwi [90,95] item1 4.4
kiwi [90,95] item2 4.4
kiwi [90,95] item3 4.4
到目前为止,我已经尝试使用双 for 循环和索引切片与 numpy 数组并使用 pandas.wide_to_long。
a = np.array([['apple' ,tuple([81]) ,1.1 ,1.1 ,1.1] ,['orange' ,tuple([82]) ,2.2 ,2.2 ,2.2],['banana' ,tuple([41,42,43,52]) ,3.3 ,3.3 ,3.3],['kiwi' ,tuple([90,95]) ,4.4 ,4.4 ,4.4]])
names = ['type' ,'rid' ,'item1' ,'item2' ,'item3']
df = pd.DataFrame(a,columns=names)
最佳答案
您可以将前 2 列放入索引中,堆叠生成的数据帧,然后重置索引:
df.set_index(['type', 'rid']).stack().reset_index()
给出:
type rid level_2 0
0 apple [81] item1 1.1
1 apple [81] item2 1.1
2 apple [81] item3 1.1
3 orange [82] item1 2.2
4 orange [82] item2 2.2
5 orange [82] item3 2.2
6 banana [41,42,43,52] item1 3.3
7 banana [41,42,43,52] item2 3.3
8 banana [41,42,43,52] item3 3.3
9 kiwi [90,95] item1 4.4
10 kiwi [90,95] item2 4.4
11 kiwi [90,95] item3 4.4
只需重命名新列即可:
df.set_index(['type', 'rid']).stack().reset_index().rename(columns={'level_2': 'gid',
0: 'value'})
给出预期的数据帧。
关于python - 如何使用 Python 将 CSV 数据从宽格式转置为长数据集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60171225/