如何将多行传输到熊猫数据框中的列?
How to transfer multiple rows into columns in panda data frame?
我有一个数据框如下:
mydata_frame:
IDs days f1 f2 f3 ... fn
Id1 day1 5 6 21 ... 5
Id1 delta_day0&day1 0 0 0 ... 0
Id1 day2 21 1 4 ... 2
Id1 delta_day1&day2 16 5 17 ... 3
Id1 day3 30 2 5 ... 2
Id1 delta_day2&day3 9 1 1 ... 0
... ... .. .. .. ... ...
Id2 day1 8 9 10 ... 2
Id2 delta_day0&day1 0 0 0 ... 0
Id2 day2 12 10 7 ... 6
Id2 delta_day1&day2 4 1 3 ... 4
Id2 day3 22 25 3 ... 1
Id2 delta_day2&day3 10 15 4 ... 5
我想将包含 delta 的所有行的值转移到列中。所以我想要的输出应该是这样的:
output:
IDs days f1 del_f1 f2 del_f2 f3 del_f3 ... fn del_fn
Id1 day1 5 0 6 0 21 0 ... 5 0
Id1 day2 21 16 1 5 4 17 ... 2 3
Id1 day3 30 9 2 1 5 1 ... 2 0
... ... .. .. .. ... ...
Id2 day1 8 0 9 0 10 0 ... 2 0
Id2 day2 12 4 10 1 7 3 ... 6 4
Id2 day3 22 10 25 15 3 4 ... 1 5
有什么想法可以有效地进行这种转换吗?
您可以立即(仅几天)构建一个 Dataframe,即只保留从索引 0 开始的每两行。
然后插入新列(从第 4 列开始,即索引 3),其中包含前一列的延迟值(每两行从 1 开始):
df2 = df.iloc[::2]
new_index = df2.index
i = 3
for col in df.columns[2:]:
new_col = "del_" + col
series = pd.Series(df[col].iloc[1::2])
series.index = new_index
df2.insert(i, new_col, series)
i+=2
print(df2)
你可以这样做:
df1 = df[df.days.str.startswith("day")].reset_index(drop=True)
df2 = (
df.loc[df.days.str.startswith("delta"), df.columns[2:]]
.rename(columns={c: f"del_{c}" for c in df.columns[2:]})
.reset_index(drop=True)
)
df = pd.concat([df1, df2], axis="columns")
n == 3
的结果和以下示例数据帧 df
IDs days f1 f2 f3
0 Id1 day1 5 6 21
1 Id1 delta_day0&day1 0 0 0
2 Id1 day2 21 1 4
3 Id1 delta_day1&day2 16 5 17
4 Id1 day3 30 2 5
5 Id1 delta_day2&day3 9 1 1
6 Id2 day1 8 9 10
7 Id2 delta_day0&day1 0 0 0
8 Id2 day2 12 10 7
9 Id2 delta_day1&day2 4 1 3
10 Id2 day3 22 25 3
11 Id2 delta_day2&day3 10 15 4
是
IDs days f1 f2 f3 del_f1 del_f2 del_f3
0 Id1 day1 5 6 21 0 0 0
1 Id1 day2 21 1 4 16 5 17
2 Id1 day3 30 2 5 9 1 1
3 Id2 day1 8 9 10 0 0 0
4 Id2 day2 12 10 7 4 1 3
5 Id2 day3 22 25 3 10 15 4
我有一个数据框如下:
mydata_frame:
IDs days f1 f2 f3 ... fn
Id1 day1 5 6 21 ... 5
Id1 delta_day0&day1 0 0 0 ... 0
Id1 day2 21 1 4 ... 2
Id1 delta_day1&day2 16 5 17 ... 3
Id1 day3 30 2 5 ... 2
Id1 delta_day2&day3 9 1 1 ... 0
... ... .. .. .. ... ...
Id2 day1 8 9 10 ... 2
Id2 delta_day0&day1 0 0 0 ... 0
Id2 day2 12 10 7 ... 6
Id2 delta_day1&day2 4 1 3 ... 4
Id2 day3 22 25 3 ... 1
Id2 delta_day2&day3 10 15 4 ... 5
我想将包含 delta 的所有行的值转移到列中。所以我想要的输出应该是这样的:
output:
IDs days f1 del_f1 f2 del_f2 f3 del_f3 ... fn del_fn
Id1 day1 5 0 6 0 21 0 ... 5 0
Id1 day2 21 16 1 5 4 17 ... 2 3
Id1 day3 30 9 2 1 5 1 ... 2 0
... ... .. .. .. ... ...
Id2 day1 8 0 9 0 10 0 ... 2 0
Id2 day2 12 4 10 1 7 3 ... 6 4
Id2 day3 22 10 25 15 3 4 ... 1 5
有什么想法可以有效地进行这种转换吗?
您可以立即(仅几天)构建一个 Dataframe,即只保留从索引 0 开始的每两行。
然后插入新列(从第 4 列开始,即索引 3),其中包含前一列的延迟值(每两行从 1 开始):
df2 = df.iloc[::2]
new_index = df2.index
i = 3
for col in df.columns[2:]:
new_col = "del_" + col
series = pd.Series(df[col].iloc[1::2])
series.index = new_index
df2.insert(i, new_col, series)
i+=2
print(df2)
你可以这样做:
df1 = df[df.days.str.startswith("day")].reset_index(drop=True)
df2 = (
df.loc[df.days.str.startswith("delta"), df.columns[2:]]
.rename(columns={c: f"del_{c}" for c in df.columns[2:]})
.reset_index(drop=True)
)
df = pd.concat([df1, df2], axis="columns")
n == 3
的结果和以下示例数据帧 df
IDs days f1 f2 f3
0 Id1 day1 5 6 21
1 Id1 delta_day0&day1 0 0 0
2 Id1 day2 21 1 4
3 Id1 delta_day1&day2 16 5 17
4 Id1 day3 30 2 5
5 Id1 delta_day2&day3 9 1 1
6 Id2 day1 8 9 10
7 Id2 delta_day0&day1 0 0 0
8 Id2 day2 12 10 7
9 Id2 delta_day1&day2 4 1 3
10 Id2 day3 22 25 3
11 Id2 delta_day2&day3 10 15 4
是
IDs days f1 f2 f3 del_f1 del_f2 del_f3
0 Id1 day1 5 6 21 0 0 0
1 Id1 day2 21 1 4 16 5 17
2 Id1 day3 30 2 5 9 1 1
3 Id2 day1 8 9 10 0 0 0
4 Id2 day2 12 10 7 4 1 3
5 Id2 day3 22 25 3 10 15 4