循环添加Pandas DataFrame

问题描述 投票:1回答:1

假设我有一个这样的df

df = pd.DataFrame({'A': [1,2,3,4,5], 'A_z': [2,3,4,5,6], 'B': [3,4,5,6,7], 'B_z': [4,5,6,7,8], 
                  'C': [5,6,7,8,9], 'C_z': [6,7,8,9,10]})

看起来像这样:

   A  A_z  B  B_z  C  C_z
0  1    2  3    4  5    6
1  2    3  4    5  6    7
2  3    4  5    6  7    8
3  4    5  6    7  8    9
4  5    6  7    8  9   10

我想做的是创建一个新的df,并为每个字母(A,B,C)垂直附加此新df,每个字母两列的数据如下所示:

    Letter  Letter_z
0        1         2
1        2         3
2        3         4
3        4         5
4        5         6
5        3         4
6        4         5
7        5         6
8        6         7
9        7         8
10       5         6
11       6         7
12       7         8
13       8         9
14       9        10

就我而言,类似的东西应该可以正常工作:

for col in df.columns:
    if col[-1] != 'z':
        new_df = new_df.append(df[[col, col + '_z']])

但是这会导致以下混乱:

     A  A_z    B  B_z    C   C_z
0  1.0  2.0  NaN  NaN  NaN   NaN
1  2.0  3.0  NaN  NaN  NaN   NaN
2  3.0  4.0  NaN  NaN  NaN   NaN
3  4.0  5.0  NaN  NaN  NaN   NaN
4  5.0  6.0  NaN  NaN  NaN   NaN
0  NaN  NaN  3.0  4.0  NaN   NaN
1  NaN  NaN  4.0  5.0  NaN   NaN
2  NaN  NaN  5.0  6.0  NaN   NaN
3  NaN  NaN  6.0  7.0  NaN   NaN
4  NaN  NaN  7.0  8.0  NaN   NaN
0  NaN  NaN  NaN  NaN  5.0   6.0
1  NaN  NaN  NaN  NaN  6.0   7.0
2  NaN  NaN  NaN  NaN  7.0   8.0
3  NaN  NaN  NaN  NaN  8.0   9.0
4  NaN  NaN  NaN  NaN  9.0  10.0

我在做什么错?任何帮助将不胜感激,欢呼。

python pandas append
1个回答
1
投票

一个想法是将Series.str.splitSeries.str.split用作expand=True,然后将MultiIndex用作避免rename,最后使用新的列名,按NaN进行整形,按DataFrame.stack进行正确排序,然后最后删除DataFrame.stack

DataFrame.sort_index

或者如果可能的话,可以将所有非DataFrame.sort_index值重塑为一列,而将所有MultiIndex值重塑为另一列,并使用df.columns = df.columns.str.split('_', expand=True) df = df.rename(columns=lambda x:'Letter_z' if x == 'z' else 'Letter', level=1) df = df.stack(0).sort_index(level=[1,0]).reset_index(drop=True) print (df) Letter Letter_z 0 1 2 1 2 3 2 3 4 3 4 5 4 5 6 5 3 4 6 4 5 7 5 6 8 6 7 9 7 8 10 5 6 11 6 7 12 7 8 13 8 9 14 9 10 来简化问题:

z
© www.soinside.com 2019 - 2024. All rights reserved.