在python中使用数据内容作为列创建表

2024-05-20 18:43:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我现在有这样的原始数据:

person1  person2   person3...
  blue     red      green
  red      blue     yellow
  black    black
  white    green
  orange

有很多不同的值和列。你知道吗

我需要的是:

         Blue  Red  Black  Green Yellow Orange White
Person1   Y     Y     Y                    Y     Y
Person2   Y     Y     Y      Y
Person3                      Y      Y

有什么建议吗?你知道吗

谢谢


Tags: 原始数据greenblueredblackwhiteorangeyellow
3条回答

方法1:^{}+pd.value_counts

new_df=df.apply(pd.value_counts).replace({1:'Y',np.nan:''}).T
print(new_df)

        black blue green orange red white yellow
person1     Y    Y            Y   Y     Y       
person2     Y    Y     Y          Y             
person3                Y                       Y 

方法2:^{}+^{}

df2=df.melt()
new_df=pd.crosstab(df2['variable'],df2['value']).replace({0:'',1:'Y'}).rename_axis(index=None,columns=None)
print(new_df)
        black blue green orange red white yellow
person1     Y    Y            Y   Y     Y       
person2     Y    Y     Y          Y             
person3                Y                       Y

你可以试试这个

>>> import pandas as pd
>>> df = pd.DataFrame({'person1': ['blue', 'red', 'black', 'white', 'orange'],
                       'person2': ['red', 'blue', 'black', 'green', ''],
                       'person3': ['green', 'yellow', '', '', '']})
>>> df.T.stack().str.get_dummies().sum(level=0).replace({1: 'Y', 0: ''})
        black blue green orange red white yellow
person1     Y    Y            Y   Y     Y
person2     Y    Y     Y          Y
person3                Y                       Y

我将使用get_dummies(您可以在末尾添加map({True:'Y',False:''})

s=pd.get_dummies(df1)
s.columns=pd.MultiIndex.from_tuples(s.columns.str.split('_').map(tuple))
Yourdf=s.stack(0).sum(level=1).eq(1)
Yourdf
Out[132]: 
         black   blue  green  orange    red  white  yellow
person1   True   True  False    True   True   True   False
person2   True   True   True   False   True  False   False
person3  False  False   True   False  False  False    True

或者

pd.concat([df1[x].str.get_dummies() for x in df1.columns],keys=df1.columns,axis=1).\
        stack(1).sum(level=1).T.eq(1)
Out[164]: 
         black   blue  green  orange    red  white  yellow
person1   True   True  False    True   True   True   False
person2   True   True   True   False   True  False   False
person3  False  False   True   False  False  False    True

相关问题 更多 >