【问题标题】:how to create multiple columns using values in one column pandas如何使用一列熊猫中的值创建多列
【发布时间】:2021-09-29 04:35:41
【问题描述】:

数据目前的结构如下:

data
name1
addr1
url1
vol1
name2
addr2
url2
vol2
name3
addr3
url3
vol3

预期结构:

Name Addr url Vol
name1 addr1 url1 vol1
name2 addr2 url2 vol2
name3 addr3 url3 vol3

我需要从列中提取数据并基于标准,即如果记录是名称、id、url 或卷,则为每个列创建一个列

【问题讨论】:

  • 行是否总是按顺序排列:name、addr、urlm col?
  • 不,有些情况下订单会发生变化

标签: python pandas etl


【解决方案1】:

此答案假定您提供的值不是真实值:即这些值是有意义的,而不是像那样按字面编号。数据通常没有那么好表述。

它还假设您总是有一系列重复出现的姓名、地址等,每四行重复出现一次,无一例外的是行为良好的df.index,这只是每行的数字计数。

制作索引,指定每个元素将在哪一行和哪一列结束。

>>> df['columns'] = df.index % 4
>>> df['rows'] = df.index // 4
>>> df[['rows', 'columns', 'data']]
    rows  columns   data
0      0        0  name1
1      0        1  addr1
2      0        2   url1
3      0        3   vol1
4      1        0  name2
5      1        1  addr2
6      1        2   url2
7      1        3   vol2
8      2        0  name3
9      2        1  addr3
10     2        2   url3
11     2        3   vol3

这将创建一个类似于上面的数据框(我对列进行了排序以更轻松地可视化正在发生的事情)。然后解开你的数据。

>>> df.set_index(['rows', 'columns']).unstack()
          data                   
columns      0      1     2     3
rows                             
0        name1  addr1  url1  vol1
1        name2  addr2  url2  vol2
2        name3  addr3  url3  vol3

在此之后,折叠列多索引df.columns = df.columns.get_level_values(1),然后重命名df.rename(columns={INT: NAME, INT: NAME, ...}, inplace=True)。如果您有不同的变量名称,请根据需要进行调整。

【讨论】:

  • df['columns'] = df.index % 4 没有给我一个偶数系列,这意味着我得到类似 0 1 2 3 4 0 1 3 4 5 的东西,这反过来又搞砸了输出任何建议/建议?谢谢
  • df.reset_index(drop=True)
  • 重置索引会强制现有的索引,它似乎不是一个简单的行序列计数(从0开始),变成一个简单的序列计数。
  • 感谢@ifly6 得到所需的输出
猜你喜欢
  • 1970-01-01
  • 2023-04-02
  • 2023-02-09
  • 1970-01-01
  • 1970-01-01
  • 2021-04-16
  • 2021-03-31
  • 2021-11-30
  • 2015-01-14
相关资源
最近更新 更多