【问题标题】:Filling a dataframe column with values from another column, based on values from a third column根据第三列的值,用另一列的值填充数据框列
【发布时间】:2021-08-21 22:51:54
【问题描述】:
我有一个如下所示的 pandas 数据框。我根据 RefIDPrefix 列中的唯一值创建了最后 3 列。
| RefIDPrefix |
RefIDNumber |
GO |
PMID |
Reactome |
| GO |
12345 |
|
|
|
| PMID |
23456 |
|
|
|
| Reactome |
34567 |
|
|
|
| GO |
45678 |
|
|
|
| GO |
56789 |
|
|
|
| PMID |
67890 |
|
|
|
我想填写最后 3 列,如下所示。基本上,根据RefIDPrefix中的值,我想把RefIDNumber中的值放到RefIDPrefix对应的正确列中。
| RefIDPrefix |
RefIDNumber |
GO |
PMID |
Reactome |
| GO |
12345 |
12345 |
|
|
| PMID |
23456 |
|
23456 |
|
| Reactome |
34567 |
|
|
34567 |
| GO |
45678 |
45678 |
|
|
| GO |
56789 |
56789 |
|
|
| PMID |
67890 |
|
67890 |
|
我一直在尝试这样做,但一直无法弄清楚如何去做。任何帮助将不胜感激!
【问题讨论】:
标签:
python
pandas
dataframe
【解决方案1】:
您可以使用df.pivot() 将列从RefIDPrefix 和.join() 构建回原来的df
df.join(df.pivot(columns='RefIDPrefix', values='RefIDNumber').fillna(''))
输出:
RefIDPrefix RefIDNumber GO PMID Reactome
0 GO 12345 12345.0
1 PMID 23456 23456.0
2 Reactome 34567 34567.0
3 GO 45678 45678.0
4 GO 56789 56789.0
5 PMID 67890 67890.0
编辑
对于新列中数字的显示格式(目前显示为float带小数点的数字),如果你的RefIDNumber列实际上是字符串,那么新列中的数字也将是字符串并且没有小数点(如整数)。
但是,如果RefIDNumber 是数字格式(ID 号很可能是正数),我们可以通过微调.fillna() 部分将数字保留为integer,如下所示:
df.join(df.pivot(columns='RefIDPrefix', values='RefIDNumber').fillna(-1, downcast='infer').replace(-1, ''))
输出:
RefIDPrefix RefIDNumber GO PMID Reactome
0 GO 12345 12345
1 PMID 23456 23456
2 Reactome 34567 34567
3 GO 45678 45678
4 GO 56789 56789
5 PMID 67890 67890