python - 如何使用 Python 将 CSV 数据从宽格式转置为长数据集

标签 python pandas numpy transpose

我需要使用 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/

相关文章:

python - 使用 scikit-learn 在 Python 中使用稀疏矩阵进行 kNN 估计?

python - 在 Python Pandas 数据框中计算 MRR

python - 如何在操作中用以前的值填充 NaN 值?

python - 关于 id 在实例方法上的行为

python - 如何在 Python 中找到继承变量的来源?

python - 尝试计算 softmax 值,得到 AttributeError : 'list' object has no attribute 'T'

python - 用于收集 numpy 数组的高效查找表

python - 将日期列和时间列合并为日期时间列

python - Pandas:如何创建一个列,该列指示值何时出现在另一列中预先设定的行数?

python - 有效地重新堆叠 numpy ndarray