Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 熊猫-将匹配的列值与行对齐_Python_Pandas_Dataframe - Fatal编程技术网

Python 熊猫-将匹配的列值与行对齐

Python 熊猫-将匹配的列值与行对齐,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个看似简单的问题,我无法找到解决办法。也就是说,我有一个表,其中第一列包含所有可用应用程序的列表,而其他列表示用户及其拥有的应用程序列表: 我试图将表转换为DataFrame,并对齐第一列上的匹配值。所需的输出应如下所示: 感谢您的帮助。 干杯 一个关键观察结果是,在输出中,应用程序列中的值也表示该行的值(index col==value col) 下面是一个使用一些numpy工具的方法。这里,apply循环遍历感兴趣的列,np.isin对第一列(dat.Applications)执行

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

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

感谢您的帮助。
干杯

一个关键观察结果是,在输出中,应用程序列中的值也表示该行的值(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))