我有一个 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
开头的列链接到以是
。
我想要的是
- 确定具有“strt”的所有列中最大的一个,即 Astrt、Bstrt、Xstrt 和 Ystrt,并放入一个新列“Tsrt”
- 然后是新列“Tend”中相应的“结束”值。因此,例如,如果“Bstrt”是最大的,则“Bend”(是否最大无关紧要)进入“Tend”列
- 正如我所说,以
A
开头的列链接到以X
开头的列,以B
开头的列链接到以是
。所以 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
希望您清楚我要做什么。 有人可以帮忙吗?谢谢。
最佳答案
使用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
关于python - 基于 Pandas 条件的行的最大值和最小值(取决于列名),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64003115/