熊猫 - 对齐匹配的列值

2024-09-26 22:11:50 发布

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

我有一个看起来很简单的问题,我没能找到解决办法。也就是说,我有一个表,其中第一列包含所有可用应用程序的列表,而其他列表示用户和他们拥有的应用程序的列表:

enter image description here

我正在尝试将表转换为DataFrame,并在第一列上对齐匹配的值。所需的输出应如下所示:

enter image description here

import pandas as pd

df = pd.read_excel('U:/Desktop/appdata.xlsx')

df.head(10)
Out[21]: 
  Applications User 1 User 2 User 3 User 4 User 5
0         App1   App1   App2   App1   App1   App2
1         App2   App3   App3   App2   App3   App3
2         App3  App10   App4   App7   App4   App4
3         App4    NaN   App5   App8   App5   App5
4         App5    NaN    NaN  App10   App6   App6
5         App6    NaN    NaN    NaN    NaN   App7
6         App7    NaN    NaN    NaN    NaN   App8
7         App8    NaN    NaN    NaN    NaN   App9
8         App9    NaN    NaN    NaN    NaN    NaN
9        App10    NaN    NaN    NaN    NaN    NaN

df[df.apply(lambda x: x['Applications'] == x, axis=1)]
Out[22]: 
  Applications User 1 User 2 User 3 User 4 User 5
0         App1   App1    NaN   App1   App1    NaN
1         App2    NaN    NaN   App2    NaN    NaN
2         App3    NaN    NaN    NaN    NaN    NaN
3         App4    NaN    NaN    NaN    NaN    NaN
4         App5    NaN    NaN    NaN    NaN    NaN
5         App6    NaN    NaN    NaN    NaN    NaN
6         App7    NaN    NaN    NaN    NaN    NaN
7         App8    NaN    NaN    NaN    NaN    NaN
8         App9    NaN    NaN    NaN    NaN    NaN
9        App10    NaN    NaN    NaN    NaN    NaN

感谢您的帮助。 干杯!你知道吗


Tags: 应用程序dfnanapplicationsuserapp1app2app3
2条回答

下面是一个使用numpy工具的方法。在这里,apply循环遍历感兴趣的列,np.isin对第一列执行搜索(数据应用程序)如果当前列中包含相应的元素,则返回True。然后将此布尔数组转换为中的相应字符串数据应用程序如果通过np.where没有匹配项,则返回NAN。然后将结果分配回原始数据帧。你知道吗

import numpy as np

dat.iloc[:, 1:] = \
dat.iloc[:, 1:].apply(lambda x : np.where(np.isin(dat.Applications, x),
                                          dat.Applications, np.NAN))

请注意,例如使用pd.np.isin比直接导入numpy更有效,但这对我来说似乎更干净一些。你知道吗

关键的一点是,在输出中,应用程序列中的值也表示该行的值(index col==value col)

(df.iloc[:,1:]
   .melt()
   .dropna()
   .pivot(index='value',columns='variable',values='value')
   .reindex([f'App{x}' for x in range(1,11)]))

相关问题 更多 >

    热门问题