Mar*_*sic 6 python dataframe pandas
我遇到了一个看似简单的问题,但我无法找到解决方案。也就是说,我有一个表,其中第一列包含所有可用应用程序的列表,而其他列代表用户及其拥有的应用程序列表:
我正在尝试将表转换为 pandas DataFrame 并在第一列上对齐匹配值。所需的输出应如下所示:
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
Run Code Online (Sandbox Code Playgroud)
任何帮助表示赞赏。干杯!
这是使用一些 numpy 工具的方法。在这里,apply
循环遍历感兴趣的列,np.isin
对第一列 (dat.Applications) 执行搜索,如果当前列中包含相应的元素,则返回 True。然后,此布尔数组将转换为 dat.Applications 中的相应字符串,如果通过 没有匹配,则转换为 NAN np.where
。然后将结果分配回原始 DataFrame。
import numpy as np
dat.iloc[:, 1:] = \
dat.iloc[:, 1:].apply(lambda x : np.where(np.isin(dat.Applications, x),
dat.Applications, np.NAN))
Run Code Online (Sandbox Code Playgroud)
请注意,使用 pd 就可以了。np.isin
例如,而不是直接导入 numpy,但这对我来说似乎更干净一些。
归档时间: |
|
查看次数: |
1597 次 |
最近记录: |