gpt4 book ai didi

python - 如何在 Pandas 数据帧的每一行中获取包含值的预定义等价类名称的列?

转载 作者:行者123 更新时间:2023-12-04 09:15:35 24 4
gpt4 key购买 nike

# import package
import pandas as pd

问题
我有一个数据框:
data = {'row1': ['a', 'A', 'B', 'b'],
'row2': ['a', 'b', 'c', 'd'],
'row3': ['a', 'b', 'd', 'D']}
df = pd.DataFrame.from_dict(data, orient='index', columns=['col'+str(x) for x in range(4)])
看起来像:
enter image description here
我还有一个等价类列表。每个等价类由被视为等价的项目组成。
equivalenceClasses={'classA':['a','A'],
'classB':['b','B'],
'classC':['c','C'],
'classD':['d','D']}
我想创建一个数据帧,其中上述数据帧中的行被行中的字母所属的等价类的名称替换。 (每个等价类在一行中不应出现超过一次,并且我们应该使用 NaN 来填充并非所有列都由等价类名称填充的行)。即我想要这个输出:
enter image description here

我的方法
我通过以下方式实现目标:
def differentClasses(colvalues):
return list(set([equivalenceClassName for colvalue in colvalues
for equivalenceClassName, equivalenceClass in zip(equivalenceClasses.keys(),
equivalenceClasses.values())
if colvalue in equivalenceClass]))
( On list comprehension , on nested list comprehension .)
df['classes'] = df.apply(lambda row : differentClasses(row['col'+str(x)] for x in range(4)), axis = 1) 
(受 this 影响。) df此时看起来像这样:
enter image description here
完成:
result_df = pd.DataFrame(df['classes'].tolist(),index=df.index,columns=['classcol'+str(x) for x in range(4)])
result_df是上面所需的输出。

问题
有没有更标准的方法来做到这一点?就像是:
df.equivalenceClassify(equivalenceClassList)
我得到我的输出?

最佳答案

我们需要根据您原来的 equivalenceClasses 创建新的字典,然后就做 replace

from collections import ChainMap
d = dict(ChainMap(*[dict.fromkeys(y,x) for x , y in equivalenceClasses.items()]))
df = df.replace(d)
Out[299]:
col0 col1 col2 col3
row1 classA classA classB classB
row2 classA classB classC classD
row3 classA classB classD classD
然后
df = df.mask(df.apply(pd.Series.duplicated,1))
Out[307]:
col0 col1 col2 col3
row1 classA NaN classB NaN
row2 classA classB classC classD
row3 classA classB classD NaN

关于python - 如何在 Pandas 数据帧的每一行中获取包含值的预定义等价类名称的列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63237043/

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