繁体   English   中英

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

[英]How to get columns containing names of pre-defined equivalence classes of values in each row of a Pandas dataframe?

# import package
import pandas as pd

问题

我有一个 dataframe:

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)])

看起来像:

在此处输入图像描述

我还有一个等价类列表。 每个等价物 class 由被视为等价物的项目组成。

equivalenceClasses={'classA':['a','A'],
                    'classB':['b','B'],
                    'classC':['c','C'],
                    'classD':['d','D']}

我想创建一个 dataframe,其中上面 dataframe 中的行被行中字母所属的等价类的名称替换 (每个等价 class 应该在一行中出现不超过一次,我们应该使用NaN来后填充行,其中并非所有列都由等价类的名称填充)。 即我想要这个 output:

在此处输入图像描述


我的方法

我通过以下方式实现目标:

def differentClasses(colvalues):
    return list(set([equivalenceClassName for colvalue in colvalues
                                          for equivalenceClassName, equivalenceClass in zip(equivalenceClasses.keys(),
                                                                                   equivalenceClasses.values())
                                          if colvalue in equivalenceClass]))

关于列表理解关于嵌套列表理解。)

df['classes'] = df.apply(lambda row : differentClasses(row['col'+str(x)] for x in range(4)), axis = 1) 

受此影响。)

此时的df如下所示:

在此处输入图像描述

完成:

result_df = pd.DataFrame(df['classes'].tolist(),index=df.index,columns=['classcol'+str(x) for x in range(4)])

result_df就是上面想要的 output。


问题

有没有更标准的方法来做到这一点? 就像是:

df.equivalenceClassify(equivalenceClassList)

我得到了我的 output?

我们需要根据您原来的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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM