【问题标题】:How to transpose only a specific amount and add it to the existing dataframe如何仅转置特定数量并将其添加到现有数据框中
【发布时间】:2022-01-25 01:47:45
【问题描述】:

我在互联网上搜索了我的问题的解决方案,但我找不到它。 我有以下数据框

  pos1 pos2 pos3
0    A    A    A
1    B    B    B
2    C    C    C
3    D    D    D
4    E    E    E
5    F    F    F
6    G    G    G
7    H    H    H
8    I    I    I

我想将以下数据框添加到现有数据框:

  pos1 pos2 pos3
0    A    B    C
1    A    B    C
2    A    B    C
3    D    E    F
4    D    E    F
5    D    E    F
6    G    H    I
7    G    H    I
8    G    H    I

这样我得到以下数据框:

   pos1 pos2 pos3
0     A    A    A
1     B    B    B
2     C    C    C
3     D    D    D
4     E    E    E
5     F    F    F
6     G    G    G
7     H    H    H
8     I    I    I
9     A    B    C
10    A    B    C
11    A    B    C
12    D    E    F
13    D    E    F
14    D    E    F
15    G    H    I
16    G    H    I
17    G    H    I

我知道行数总是列数的倍数。这意味着如果我有 4 列,那么行应该是 4、8、12、16 等。我的示例是列是 3,行是 9

然后我想要做的是将行转换为列,但仅针对该列数。所以我希望前 3 行与列一起转置,然后是接下来的 3 行,依此类推。

我现在有以下代码:

import pandas as pd
import io

s = """pos1 pos2 pos3
A A A
B B B
C C C
D D D
E E E 
F F F
G G G
H H H
I I I
"""
df = pd.read_csv(io.StringIO(s), delim_whitespace=True)

final_df = df.copy()
index_values = final_df.index.values

value = 0
while value <  len(df.index):
    sub_df = df[value:value+3]
    sub_df.columns = index_values[value: value + 3]
    sub_df = sub_df.T
    sub_df.columns = df.columns
    final_df = pd.concat([final_df, sub_df])

    value += len(df.columns)
final_df = final_df.reset_index(drop=True)
print(final_df)

由于forloop,我现在的代码很慢。 不使用forloop是否可以得到同样的解?

【问题讨论】:

标签: python pandas dataframe


【解决方案1】:

您可以使用带有ravelreshape 的底层numpy 数组,带有order='F' 参数(column-major order) 和pandas.DataFrame 构造函数。

然后concat输出原始数组:

pd.concat([df,
           pd.DataFrame(df.to_numpy().ravel().reshape(df.shape, order='F'),
                        columns=df.columns)
          ], ignore_index=True)

输出:

   pos1 pos2 pos3
0     A    A    A
1     B    B    B
2     C    C    C
3     D    D    D
4     E    E    E
5     F    F    F
6     G    G    G
7     H    H    H
8     I    I    I
9     A    D    G
10    A    D    G
11    A    D    G
12    B    E    H
13    B    E    H
14    B    E    H
15    C    F    I
16    C    F    I
17    C    F    I

【讨论】:

  • 这几乎就是我想要的。输出不一样。第 9-11 行应为 A B C。第 12-14 行应为 D E F,第 15-17 行应为 G H I。
【解决方案2】:

如果您只想使用 pandas,这会有些效率。

for value in range(1,int(len(df.index)/3)):
    df.loc[len(df)+value*value]=df.iloc[(value*3)-3:value*3,0:1].T.values[0]
    df.loc[len(df)+value*value+1]=df.iloc[(value*3)-3:value*3,0:1].T.values[0]
    df.loc[len(df)+value*value+2]=df.iloc[(value*3)-3:value*3,0:1].T.values[0]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-09
    • 2013-01-27
    • 2022-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多