【问题标题】:Generating a new dataframe from existing columns从现有列生成新数据框
【发布时间】:2020-09-18 23:00:23
【问题描述】:
我正在尝试从现有的 A、B、C 列创建一个新的 D 列。
- Col D 中的第一个值为 A1
- Col D 中的第二个值是 B2
- Col D 中的第三个值是 C3
- Col D 中的第四个值是 A4
- Col D 中的第五个值是 B5
- Col D 中的第六个值是 C6
遵循此模式,Col D 中的其余值是此模式的迭代。请参考图表。
任何代码想法?
点击链接查看图片
【问题讨论】:
标签:
python
pandas
loops
dataframe
【解决方案1】:
这是另一种方式:
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
将cumsum 与lookup 一起使用:
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
【解决方案2】:
我们可以使用 pd.concat 创建一个数据框,其中包含 A、B、C 列,并通过连续迭代列并从中选择下一个值来相应地填充列中的值根据条件列然后使用DataFrame.agg 通过删除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
【解决方案3】:
这里有一个解决方案(为了更清楚,分几个步骤):
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