【问题标题】:transpose a subset columns in dataframe (not groupby, need to create new columns)转置数据框中的子集列(不是 groupby,需要创建新列)
【发布时间】:2013-06-07 10:07:10
【问题描述】:

我有一个有两列的表,第一列是网站的索引,第二列是 24 小时内每小时的状态数。因此,对于每个站点,我都有 24(行)x2(列)数据。如何将第二列(每个站点 24 行数据)转换为包含 24+1 列和站点索引的行。

我通过使用循环创建新行找到了一个幼稚的解决方案:

for i in range(numberOfsites):
    i1 = i*24
    i2 = i1 + 24
    newLine = DataFrame(sitesData,index=list(range(i1,i2)), columns=["siteState"]).T

谁能提出另一个更简单的解决方案?先感谢您。

原始数据:(感谢 Andy Hayden 提供数据)

   site_index state
0           1     a
1           1     b
2           1     a
3           2     a
4           2     a
5           2     b

所需数据:

              0  1  2
  site_index
  1           a  b  a
  2           a  a  b

【问题讨论】:

  • sitesData 是什么(为什么不能直接转置它)?我很难准确理解你在这里问什么,一方面,你编写的代码只创建了一个 DataFrame (newLine),大概这不是你想要的。你能举个假数据的例子吗?
  • 由于sitesData包含两列,第一列是站点索引,第二列是siteState。 sitesData 包含 n 个站点信息,因此有 n*24 行数据。对于每个站点,它在 siteData 中有 24 行。我不能简单地转置sitesData。
  • 我在回答中给出了一些虚拟数据,因为这是我对您所问问题的最佳猜测:)
  • 您能否编辑您的问题以同时显示您的实际输入数据和您的预期输出数据?

标签: python dataframe pandas transpose


【解决方案1】:

虽然这感觉有点 hacky,但您可以使用 groupby

In [11]: df
Out[11]:
   site_index state
0           1     a
1           1     b
2           1     a
3           2     a
4           2     a
5           2     b

In [12]: g = df.groupby('site_index')

In [13]: g.apply(lambda x: x.state.reset_index(drop=True).T)
Out[13]:
            0  1  2
site_index
1           a  b  a
2           a  a  b

这也可以使用unstack...

【讨论】:

    猜你喜欢
    • 2019-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多