【问题标题】:How to reconfigure a pandas dataframe?如何重新配置​​熊猫数据框?
【发布时间】:2023-04-09 14:24:01
【问题描述】:

我正在尝试重新配置一个 pandas 数据框,目前看起来像这样:

   A   B   C   D   E   F
0  7   5   2   1   2   2
1  3   4   3   1   4   6
2  1   3   2   6   5   5

变成这样:

   c1  c2  c3  
0  7   5   2
0  1   2   2
1  3   4   3
1  1   4   6
2  1   3   2   
2  6   5   5

(尝试拆分数据框,然后将后一个切片作为新行放在下面 - c1、c2、c3 是新的列标签)

【问题讨论】:

  • 在你的真实数据中是len(df.columns) % 3总是0 ?
  • 不,列的长度是 75000

标签: python pandas dataframe subset data-munging


【解决方案1】:

我相信这里有必要将值重新整形为 3 列,列长度的唯一必要模数是 0

print (len(df.columns) % 3)
0

df = pd.DataFrame(df.values.reshape(-1, 3), 
                  columns=[f'c{x}' for x in range(1, 4)], 
                  index = np.repeat(df.index, len(df.columns) / 3))
print (df)

   c1  c2  c3
0   7   5   2
0   1   2   2
1   3   4   3
1   1   4   6
2   1   3   2
2   6   5   5

编辑:

我尝试模拟您的问题 - 添加新列 G 并在 3 列中获得输出:

print (df)
   A  B  C  D  E  F   G
0  7  5  2  1  2  2  10
1  3  4  3  1  4  6  20
2  1  3  2  6  5  5  30

如果需要输出中的所有值,则添加来自末尾的值NaNs,因为不存在:

N = 3
c = np.arange(len(df.columns))
df.columns = [c % N, c // N]

df = df.stack().reset_index(drop=True)
df.columns = [f'{x + 1}' for x in df.columns]
print (df)
    1    2    3
0   7  5.0  2.0
1   1  2.0  2.0
2  10  NaN  NaN
3   3  4.0  3.0
4   1  4.0  6.0
5  20  NaN  NaN
6   1  3.0  2.0
7   6  5.0  5.0
8  30  NaN  NaN

另一个想法是删除通过索引创建 NaN 的列 - 这里是列 G

N = 3
c = len(df.columns)
last = (c % N)

df = df.iloc[:, :-last]
print (df)
   A  B  C  D  E  F
0  7  5  2  1  2  2
1  3  4  3  1  4  6
2  1  3  2  6  5  5

然后使用原始解决方案:

df = pd.DataFrame(df.values.reshape(-1, 3), 
                  columns=[f'c{x}' for x in range(1, 4)], 
                  index = np.repeat(df.index, len(df.columns) / 3))
print (df)
   c1  c2  c3
0   7   5   2
0   1   2   2
1   3   4   3
1   1   4   6
2   1   3   2
2   6   5   5

【讨论】:

  • 谢谢@jezrael。我已经简化了问题的 df 。我的实际 df 我正在处理 100x75000 形状的 df。我试图为每个当前行获取 0 到 3725 列存储为新 df 的第一行。然后将接下来的 3725 到 75000 列存储在新 df 的第二行中
  • 不确定这部分函数“len(df.columns)/3)”是否会给我所需的正确df?
  • @user341383 - 因为列的长度必须能被 3 整除且没有残差
  • 好的,我明白了。对于我的实际 df,我需要做的是 len(df.columns)/2 ,以获得 3750 列?
  • @user341383 - 所以在你的真实数据中这是不可能的。所以你的问题应该是模拟的,如果添加新列 G 并且在输出中仍然需要 3 列。那么如果一个新列 G 的预期输出是什么?
【解决方案2】:

如果列数可以被 3 整除,并且您想要唯一的索引名称:

import numpy as np
import pandas as pd

df = pd.DataFrame({'A': [7.0, 3.0, 1.0],
          'B': [5.0, 4.0, 3.0],
          'C': [2.0, 3.0, 2.0],
          'D': [1.0, 1.0, 6.0],
          'E': [2.0, 4.0, 5.0],
          'F': [2.0, 6.0, 5.0]})

df1 = pd.DataFrame(df.to_numpy().reshape(-1,3), columns = ['c1','c2','c3'])

print(df1)

    c1   c2   c3
0  7.0  5.0  2.0
1  1.0  2.0  2.0
2  3.0  4.0  3.0
3  1.0  4.0  6.0
4  1.0  3.0  2.0
5  6.0  5.0  5.0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-16
    • 2018-02-13
    • 1970-01-01
    • 2022-06-13
    • 1970-01-01
    • 1970-01-01
    • 2015-02-22
    相关资源
    最近更新 更多