从现有列生成新的数据帧

2024-05-14 09:18:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试从现有的a、B、C列创建一个新的D列

  • 列D中的第一个值是A1
  • 列D中的第二个值是B2
  • 列D中的第三个值是C3
  • 列D中的第四个值是A4
  • D列中的第五个值是B5
  • 列D中的第六个值是C6

遵循此模式,列D中的其余值是此模式的迭代。请参考图表

有什么代码想法吗

单击链接以查看图片

enter image description here


Tags: 代码链接a1图表模式图片b2a4
3条回答

我们可以使用^{}来创建一个数据帧,其中包含ABC列中的值通过连续迭代列并根据条件从该列中选择下一个值来填充,然后使用^{}通过删除NaN值来对数据帧进行聚合:

d = pd.concat([df[col].iloc[i::df.columns.size] for i, col in enumerate(df.columns)], axis=1)
df['D'] = d.agg(lambda s: s.dropna().iloc[0], axis=1)

结果:

# print(df)
    A   B   C   D
0  A1  B1  C1  A1
1  A2  B2  C2  B2
2  A3  B3  C3  C3
3  A4  B4  C4  A4
4  A5  B5  C5  B5
5  A6  B6  C6  C6

还有一种方法:

import pandas as pd
import numpy as np

#Create input dataframe:
df = pd.DataFrame(index=[*'123456'], columns=[*'ABC'])
df = df.apply(lambda x: x.name+x.index)
df

输入数据帧:

    A   B   C
1  A1  B1  C1
2  A2  B2  C2
3  A3  B3  C3
4  A4  B4  C4
5  A5  B5  C5
6  A6  B6  C6

cumsumlookup一起使用:

s = ((df['A'].notna().cumsum()-1) % df.shape[1])
df['d'] = df.lookup(df.index, df.columns[s])
df

输出:

    A   B   C   d
1  A1  B1  C1  A1
2  A2  B2  C2  B2
3  A3  B3  C3  C3
4  A4  B4  C4  A4
5  A5  B5  C5  B5
6  A6  B6  C6  C6

以下是一个解决方案(为了更清晰,分两个步骤):

df = pd.DataFrame({"a": range(0, 10), "b": range(10, 20), "c": range(20, 30)})

df["inx"] = range(len(df))
df["d"] = np.where(df.inx % 3 == 0, df["a"], 
         np.where(df.inx % 3 == 1, df["b"], df["c"]))
df = df.drop("inx", axis="columns")

结果:

   a   b   c   d
0  0  10  20   0
1  1  11  21  11
2  2  12  22  22
3  3  13  23   3
4  4  14  24  14
5  5  15  25  25
6  6  16  26   6
7  7  17  27  17
8  8  18  28  28
9  9  19  29   9

相关问题 更多 >

    热门问题