gpt4 book ai didi

python-2.7 - 基于不同计数的列记录

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

我有一个像这样的 Pandas 数据框:

import pandas as pd

data = {'VAR1': ['A', 'A', 'A', 'A','B', 'B'],

'VAR2': ['C', 'V', 'C', 'C','V', 'D']}

frame = pd.DataFrame(data)

基本上我需要重新编码每个变量。重新编码的工作方式如下:计算每列不同值的计数,如果计数大于或等于阈值,则保留原始值,否则设置新值“X”。如果阈值是 3,那么这就是它需要的样子。

data2 = {'VAR3': ['A', 'A', 'A', 'A','X', 'X'],

'VAR4': ['C', 'X', 'C', 'C','X', 'X']}

frame2 = pd.DataFrame(data2)

这是所需的输出,原始数据合并到重新编码的数据。

pd.merge(frame, frame2, left_index=True, right_index=True)

我是 Python 的新手,虽然 Python for Data Analysis 这本书确实对我有帮助,但我仍然不太清楚如何以简单的方式获得所需的结果。任何帮助将不胜感激!

最佳答案

分别获取每一列。按值对其进行分组,并在组上使用 filter 方法将任何少于 3 个值的组替换为 NaN。然后用 X 替换那些 NaN

你可以在一个列表理解中完成所有这些,但为了清楚起见,我定义了一个 recode 函数来完成所有实质性的事情。

In [38]: def recode(s, threshold):
....: return s.groupby(s).filter(lambda x: x.count() >= threshold, dropna=False).fillna(value='X')
....:

应用到每一列,然后将这些列重新组合成一个新的 DataFrame....

In [39]: frame2 = pd.concat([recode(frame[col], 3) for col in frame], axis=1)

In [40]: frame2
Out[40]:
VAR1 VAR2
0 A C
1 A X
2 A C
3 A C
4 X X
5 X X

而且,可以肯定的是,您可以按照您在问题中表达的方式合并原始帧和重新编码的帧:

In [27]: pd.merge(frame, frame2, left_index=True, right_index=True)
Out[27]:
VAR1_x VAR2_x VAR1_y VAR2_y
0 A C A C
1 A V A X
2 A C A C
3 A C A C
4 B V X X
5 B D X X

编辑:对 pandas 版本 < 0.12 使用此等效解决方法:

def recode(s, threshold):
b = s.groupby(s).transform(lambda x: x.count() >= threshold).astype('bool') # True/False
s[~b] = 'X'
return s

关于python-2.7 - 基于不同计数的列记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17793871/

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