gpt4 book ai didi

python - 为 Pandas DataFrame 的每一行查找跨多列的模式

转载 作者:行者123 更新时间:2023-12-03 21:03:08 25 4
gpt4 key购买 nike

我是 Python 和 Pandas 的新手。我想为 Opt_1 到 Opt_7 列的每一行找到最常见的项目。请注意,出于某种原因,某些空白单元格似乎具有 NaN,而在其他情况下则为 None。

ID  Col_1   Col_2   Opt_1   Opt_2   Opt_3   Opt_4   Opt_5   Opt_6   Opt_7 
1 Game 1 Team 1 13
2 Game 1 Team 2 -13
3 Game 1 Team 1
4 Game 1 Team 2
5 Game 2 Team 1 -7.5 -7.5 -7.5 -7.5
6 Game 2 Team 2 7.5 7.5 7.5 7.5
7 Game 2 Team 1 -2.5 -1.5
8 Game 2 Team 2 2.5 1.5
9 Game 3 Team 1 3.5 3.5
10 Game 3 Team 2 -3.5 -3.5
11 Game 3 Team 1 -1 -1.5 -1
12 Game 3 Team 2 1 1.5 1

我已经尝试了以下代码,它对大多数行(但不是全部)按预期工作。而且速度有点慢。
def freq_value(series):
return Counter(series).most_common()[0][0]

for row in df.iterrows():
df['result'] = df.apply(lambda row: freq_value((row['Opt_1'], row['Opt_2'], row['Opt_3'], row['Opt_4'], row['Opt_5'], row['Opt_6'], row['Opt_7'])), axis=1)

以下是预期结果和实际结果:
ID  Expected    Actual Result
1 NaN NaN
2 NaN NaN
3 NaN NaN
4 NaN NaN
5 -7.5 -7.5
6 7.5 7.5
7 NaN NaN
8 NaN NaN
9 3.5 3.5
10 -3.5 -3.5
11 -1 NaN
12 1 NaN

有没有这样做,所以它是 100% 正确的,并且可能不需要一次遍历每一行?在此先感谢您的任何建议。

最佳答案

使用 filter选择列和 mode + mask只找到独特的模式:

(df.filter(like='Opt')
.mode(axis=1)
.set_axis(['a', 'b'], axis=1, inplace=False)
.eval('a.mask(b.notna())', engine='python'))

0 13.0
1 -13.0
2 NaN
3 NaN
4 -7.5
5 7.5
6 NaN
7 NaN
8 3.5
9 -3.5
10 -1.0
11 1.0
Name: a, dtype: float64
mode将返回给定行的所有模式。这意味着如果有两个相同频率的值,则输出中将有两列。上面的解决方案处理最多有两列的情况。

如果众数唯一,则解可简化为
df.filter(like='Opt').mode(axis=1).iloc[:, 0]

没有唯一模式时的另一种解决方案,这将推广到输出中的任意数量的列。
u = df.filter(like='Opt').mode(axis=1)
if len(u.columns) > 1:
u = u.iloc[:, 0].where(u.iloc[:, 1:].isna().all(axis=1))

u
0 13.0
1 -13.0
2 NaN
3 NaN
4 -7.5
5 7.5
6 NaN
7 NaN
8 3.5
9 -3.5
10 -1.0
11 1.0
Name: 0, dtype: float64

关于python - 为 Pandas DataFrame 的每一行查找跨多列的模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56310134/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com