首页 > 解决方案 > 根据另一列的多行填充 DataFrame 列

问题描述

我有一个 DataFrame nplt:

nplt
Out[120]: 
     sexage  npark16cd  population  page
0       M00  E26000001  146.631840   NaN
1       M01  E26000001  122.677630   NaN
2       M02  E26000001  127.645516   NaN
3       M03  E26000001  138.313014   NaN
4       M04  E26000001  150.898252   NaN
5       M05  E26000001  149.086291   NaN
6       M06  E26000001  145.075953   NaN
7       M07  E26000001  159.893446   NaN
8       M08  E26000001  149.886962   NaN
9       M09  E26000001  182.406901   NaN
10      M10  E26000001  182.058425   NaN
11      M11  E26000001  186.962104   NaN
12      M12  E26000001  200.875284   NaN
13      M13  E26000001  209.038917   NaN
14      M14  E26000001  163.530837   NaN
15      M15  E26000001  161.171527   NaN

我希望根据性别填充列页面,例如,其中性别等于 M00、M01、M02、M03 我希望页面为 p0_3,并且性别等于 M04、M05、M06 我希望页面连续为 p4_6,例如:

nplt
Out[120]: 
     sexage  npark16cd  population  page
0       M00  E26000001  146.631840   p0_3
1       M01  E26000001  122.677630   p0_3
2       M02  E26000001  127.645516   p0_3
3       M03  E26000001  138.313014   p0_3
4       M04  E26000001  150.898252   p4_6
5       M05  E26000001  149.086291   p4_6
6       M06  E26000001  145.075953   p4_6
7       M07  E26000001  159.893446   NaN
8       M08  E26000001  149.886962   NaN
9       M09  E26000001  182.406901   NaN
10      M10  E26000001  182.058425   NaN
11      M11  E26000001  186.962104   NaN
12      M12  E26000001  200.875284   NaN
13      M13  E26000001  209.038917   NaN
14      M14  E26000001  163.530837   NaN
15      M15  E26000001  161.171527   NaN

等等。我的实际 DataFrame 中的性别列范围为 M00-M90 和 F00-F90。

有没有一种有效的方法来做到这一点?

提前谢谢了。

为了更清楚地解释,我希望 F00、F01、F02 和 F03 以及 M00、M01、M02 和 M03 系列的等价物在页面中具有值 p0_3,对于 M04、M05、M06 和 F04、F05 和F06 为页面设置值为 p4_6。例如:

nplt
    Out[120]: 
         sexage  npark16cd  population  page
    0       M00  E26000001  146.631840   p0_3
    1       M01  E26000001  122.677630   p0_3
    2       M02  E26000001  127.645516   p0_3
    3       M03  E26000001  138.313014   p0_3
    4       M04  E26000001  150.898252   p4_6
    5       M05  E26000001  149.086291   p4_6
    6       M06  E26000001  145.075953   p4_6
    7       M07  E26000001  159.893446   p7_10
    8       M08  E26000001  149.886962   p7_10
    9       M09  E26000001  182.406901   p7_10
    10      M10  E26000001  182.058425   p7_10
    11      M11  E26000001  186.962104   NaN
    12      M12  E26000001  200.875284   NaN
    13      M13  E26000001  209.038917   NaN
    14      M14  E26000001  163.530837   NaN
    15      M15  E26000001  161.171527   NaN


2355    F80  W18000003  102.553290   nan
2356    F81  W18000003  115.013810   nan
2357    F82  W18000003   94.524735   p82_85
2358    F83  W18000003   77.677229   p82_85
2359    F84  W18000003  103.239723   p82_85
2360    F85  W18000003   82.496796   p82_85
2361    F86  W18000003   71.609379   p86_90
2362    F87  W18000003   83.220993   p86_90
2363    F88  W18000003   80.120960   p86_90
2364    F89  W18000003   65.742056   p86_90
2365    F90  W18000003  204.664775   p86_90

我希望 M00-M90 和 F00-F90 (p0_4, p4_6, p7_10 ... p86_90) 中的分组相同。列页面中的值将在未来的代码中抽样分层。

列页面中有不同数量的成员的原因是因为这些是基于具有不同范围的年龄组,例如,0-3、4-6、5-7、8-12、13、14-18。 ..一直到90。

我努力了:

nplt.loc[(nplt['sexage'] == {'M00', 'M01', 'M02', 'M03', 'F00', 'F01',
                  'F02', 'F03'}), 'page'] = 'p0_3'

但是它不起作用。任何帮助都非常感谢。

标签: pythonpandasdataframewhere-clausemultiple-conditions

解决方案


indexes = {}

for i in range(0, 5):
    indexes[i] = 'p0_4'

for i in range(5, 8):
    indexes[i] = 'p5_7'

nplt['page'] = [indexes.get(x) for x in nplt['age']]

where nplt['age'] = 0 1 2 3 4 5 6 7

nplt
Out[169]: 
     sexage  npark16cd  population    page  age
0       M00  E26000001  146.631840    p0_4    0
1       M01  E26000001  122.677630    p0_4    1
2       M02  E26000001  127.645516    p0_4    2
3       M03  E26000001  138.313014    p0_4    3
4       M04  E26000001  150.898252    p0_4    4
5       M05  E26000001  149.086291    p5_7    5
6       M06  E26000001  145.075953    p5_7    6
7       M07  E26000001  159.893446    p5_7    7

推荐阅读