python - 在循环中追加 Pandas DataFrame

标签 python pandas append

假设我有一个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)垂直 append 这个新的 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

我做错了什么?任何帮助将不胜感激,干杯。

编辑:

在 jezrael 的善意帮助下,他的答案中的列的重命名让我思考了一种可能的方法来使用我最初的思路来做到这一点。

我现在还可以使用以下方法实现我想要的新 df:

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

不同的列名称显然是导致问题的原因,这是我当时没有意识到的。希望这对任何人都有帮助。

最佳答案

一个IDE是使用Series.str.split使用 expand=True 表示 MultiIndex,然后使用 rename 避免 NaN,最后使用新列名称,通过以下方式 reshape DataFrame.stack ,按 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 值 reshape 为一列并将所有 z 值 reshape 为另一列来简化问题,使用 numpy.ravel:

m = df.columns.str.endswith('_z')

a = df.loc[:, ~m].to_numpy().T.ravel()
b = df.loc[:, m].to_numpy().T.ravel()
df = pd.DataFrame({'Letter': a,'Letter_z': b})
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

关于python - 在循环中追加 Pandas DataFrame,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59134541/

相关文章:

Python/Numpy(CSV) : Finding values, append 另一个 csv

javascript - append 动态创建的表 javascript

python - Scrapy yield 项目作为 JSON 中的子项目

python - Flask,如何将字符串响应为html?

python - Geodjango:使用迁移将现有数据的 PolygonField 更改为 MultiPolygonField

python - 从 ordereddict 生成 Pandas 数据框?

python - 如何 reshape 数据框(列中的不同类型)

python - 在 Pandas 中访问 float 索引时,神奇的行是怎么回事?

jquery - 将相同的元素追加到两个位置

python - 声明类对象数据类型