我的df如下
Astrt Aend Bstrt Bend Xstrt Xend Ystrt Yend
25 27 15 16 11 12 40 42
50 51 45 46 23 25 35 36
14 15 21 20 8 9 2 3
11 11 45 49 46 47 12 13
在此df中,以A
开头的列与以X
开头的列链接,以B
开头的列与以Y
开头的列链接。
我想要的是
A
开头的列与以X
开头的列链接,以B
开头的列与以Y
开头的列链接。因此,应使用相应列的开始和结束值填充2个新列“ Ustrt”和“ Uend”
例如,如果“ Xstrt”最大,则“ Ustrt”和“ Uend”列将具有“ Astrt”和“ Aend”中的值(无需分析,只需直接输入值即可)。因此,基本上,我们需要查找所有具有'strt'的列的最大值,标识该名称并根据其关系复制值。
上面df中的预期值如下。
Astrt Aend Bstrt Bend Xstrt Xend Ystrt Yend Tstrt Tend Ustrt Uend
25 27 15 16 11 12 40 42 40 42 15 16
50 51 45 46 23 25 35 36 50 51 23 25
14 15 21 20 8 9 2 3 21 20 2 3
11 11 45 49 46 47 12 13 46 47 11 11
希望,很明显我正在尝试做。 有人可以帮忙吗?谢谢。
答案 0 :(得分:2)
使用filter
,lookup
和replace
来构造这些列:
df_strt = df.filter(regex='strt$')
df_end = df.filter(regex='end$')
s = df_strt.idxmax(1)
d = {"X":"A", "A":"X", "Y":"B", "B":"Y"}
df['Tstrt'] = df_strt.lookup(*zip(*s.items()))
df['Tend'] = df_end.lookup(*zip(*s.str.replace('strt', 'end').items()))
df['Ustrt'] = df_strt.lookup(*zip(*s.replace(d,regex=True).items()))
df['Uend'] = (df_end.lookup(*zip(*s.str.replace('strt', 'end')
.replace(d,regex=True).items())))
Out[202]:
Astrt Aend Bstrt Bend Xstrt Xend Ystrt Yend Tstrt Tend Ustrt Uend
0 25 27 15 16 11 12 40 42 40 42 15 16
1 50 51 45 46 23 25 35 36 50 51 23 25
2 14 15 21 20 8 9 2 3 21 20 2 3
3 11 11 45 49 46 47 12 13 46 47 11 11
答案 1 :(得分:1)
由于@ Andy.L和@Henry Yik,我得以弄清楚我们实现我想要实现的目标的另一种方法。出于文档目的将其放在此处。
a = df.filter(like='strt').idxmax(axis=1).str[0]
d = {"X":"A", "A":"X", "Y":"B", "B":"Y"}
df['Tstrt'] = df.filter(like='strt').max(axis=1)
df['Tend']=df.lookup(df.index,a+'end')
df['Ustrt']=df.lookup(df.index,a.map(d)+'strt')
df['Uend']=df.lookup(df.index,a.map(d)+'end')
df
Astrt Aend Bstrt Bend Xstrt Xend Ystrt Yend Tstrt Tend Ustrt Uend
25 27 15 16 11 12 40 42 40 42 15 16
50 51 45 46 23 25 35 36 50 51 23 25
14 15 21 20 8 9 2 3 21 20 2 3
11 11 45 49 46 47 12 13 46 47 11 11
答案 2 :(得分:0)
另一种解决方案:
# create temporary dataframes for start and end
strt = df.filter(regex=".strt$")
end = df.filter(regex=".end$")
Tstrt = strt.max(1).array
cond = strt.isin(Tstrt)
cond = cond.to_numpy()
Tend = end.to_numpy()[cond]
# reshape boolean array based on positions (A replaces X, B replaces Y and vice versa)
Ustrt = strt.to_numpy()[cond[:, [2, 3, 0, 1]]]
Uend = end.to_numpy()[cond[:, [2, 3, 0, 1]]]
df.assign(Tstrt=Tstrt, Tend=Tend, Ustrt=Ustrt, Uend=Uend)
不知道如何在堆栈OVerflow中正确粘贴宽数据框:
Astrt Aend Bstrt Bend Xstrt Xend Ystrt Yend Tstrt Tend Ustrt Uend
0 25 27 15 16 11 12 40 42 40 42 15 16
1 50 51 45 46 23 25 35 36 50 51 23 25
2 14 15 21 20 8 9 2 3 21 20 2 3
3 11 11 45 49 46 47 12 13 46 47 11 11