Python 熊猫-将匹配的列值与行对齐
我有一个看似简单的问题,我无法找到解决办法。也就是说,我有一个表,其中第一列包含所有可用应用程序的列表,而其他列表示用户及其拥有的应用程序列表: 我试图将表转换为DataFrame,并对齐第一列上的匹配值。所需的输出应如下所示: 感谢您的帮助。Python 熊猫-将匹配的列值与行对齐,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个看似简单的问题,我无法找到解决办法。也就是说,我有一个表,其中第一列包含所有可用应用程序的列表,而其他列表示用户及其拥有的应用程序列表: 我试图将表转换为DataFrame,并对齐第一列上的匹配值。所需的输出应如下所示: 感谢您的帮助。 干杯 一个关键观察结果是,在输出中,应用程序列中的值也表示该行的值(index col==value col) 下面是一个使用一些numpy工具的方法。这里,apply循环遍历感兴趣的列,np.isin对第一列(dat.Applications)执行
干杯 一个关键观察结果是,在输出中,应用程序列中的值也表示该行的值(index col==value col)
下面是一个使用一些numpy工具的方法。这里,
apply
循环遍历感兴趣的列,np.isin
对第一列(dat.Applications)执行搜索,如果当前列中包含相应的元素,则返回True。然后,通过np.where
将该布尔数组转换为dat.Applications中的相应字符串,如果不匹配,则转换为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是可行的,但这对我来说似乎更干净了一点。我的观点在源头上是正确的。对具有可伸缩行和列的解释是正确的,但在标记值时,仅针对每个应用程序标记一个二进制,即(App1,User1)=1和(App2,User1)=0
。这样你可以很容易地计算。还要尽量避免在列名中使用空格。@Vishnudev-我非常感谢您的反馈,您说得很对,最好是将值“二进制化”,但是,这需要事先对数据进行处理(因为问题中的格式是如何将数据传递给我),源代码并不重要。我的反馈只有在你能控制来源的情况下才有效。
(df.iloc[:,1:]
.melt()
.dropna()
.pivot(index='value',columns='variable',values='value')
.reindex([f'App{x}' for x in range(1,11)]))
import numpy as np
dat.iloc[:, 1:] = \
dat.iloc[:, 1:].apply(lambda x : np.where(np.isin(dat.Applications, x),
dat.Applications, np.NAN))