使用 Pandas DataFrame 根据值获取标题名称

5

我有一个如下所示的 Pandas DataFrame - 我正在使用 Python Pandas。

+------------+---------+---------+----------+--------+
| Movie Name | English | Chinese | Japanese | Korean |
+------------+---------+---------+----------+--------+
| A          |       1 |       0 |        0 |      0 |
| B          |       0 |       1 |        1 |      0 |
| C          |       0 |       1 |        1 |      1 |
| D          |       1 |       0 |        0 |      0 |
| E          |       0 |       1 |        0 |      0 |
+------------+---------+---------+----------+--------+

我想通过基于值(0或1)串联标头名称来将其转换为以下内容。

预期输出

+------------+-------------------------+
| Movie Name |        Languages        |
+------------+-------------------------+
| A          | English                 |
| B          | Chinese, Japanese       |
| C          | Chinese,Japanese,Korean |
| D          | English                 |
| E          | Chinese                 |
+------------+-------------------------+
4个回答

5

首先使用DataFrame.set_index创建索引,然后使用DataFrame.dot进行矩阵乘法运算,其中矩阵中的值为1,最后使用Series.str.rstrip去除最后的,,并结合Series.reset_index生成包含两列数据的DataFrame

df = df.set_index('Movie Name')
df1 = df.dot(df.columns + ',').str.rstrip(',').reset_index(name='Languages')
print (df1)
  Movie Name                Languages
0          A                  English
1          B         Chinese,Japanese
2          C  Chinese,Japanese,Korean
3          D                  English
4          E                  Chinese

3
据我所知,“melt”操作后,问题转化为一个“groupby”问题。
s=df.melt('MovieName').query('value==1').groupby('MovieName').variable.agg(','.join)
df['New']=df.MovieName.map(s)
df
Out[690]: 
  MovieName  English           ...             Korean                      New
0         A        1           ...                  0                  English
1         B        0           ...                  0         Chinese,Japanese
2         C        0           ...                  1  Chinese,Japanese,Korean
3         D        1           ...                  0                  English
4         E        0           ...                  0                  Chinese
[5 rows x 6 columns]

1

您可以使用:

df['langauges'] = (df.eq(1)*df.columns).apply(lambda x : ','.join(x), axis = 1).str.strip(',')
df

 Movie Name English Chinese Japanese    Korean  langauges
0     A       1       0        0          0      English
1     B       0       1        1          0      Chinese,Japanese
2     C       0       1        1          1      Chinese,Japanese,Korean
3     D       1       0        0          0      English
4     E       0       1        0          0      Chinese

1

可以使用pandas.Series.str.cat来完成。您可以在此处阅读更多信息 https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.str.cat.html

import pandas as pd
import numpy as np

df=pd.DataFrame({'Movie Name':['A','B','C','D','E'],'English':[1,0,0,1,0],'Chinese':[0,1,1,0,1],'Japanese':[0,1,1,0,0],'Korean':[0,0,1,0,0]})
df=df.replace(1,df.columns.to_series())
df=df.replace(0,np.NaN)
df['Languages']=df[['English','Chinese','Japanese','Korean']].apply(lambda x: x.str.cat(sep=","),axis=1)
df=df.drop(columns=['English','Chinese','Japanese','Korean'])

结果:

  Movie Name                Languages
0          A                  English
1          B         Chinese,Japanese
2          C  Chinese,Japanese,Korean
3          D                  English
4          E                  Chinese

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接