根据行中的项目数选择要填充的列

时间:2016-08-10 18:01:15

标签: pandas

所以我在数据帧中有4列:W,X,Y,Z。

我有一个CSV文件,其中包含一些行,其中一些包含4个项目,3个项目和每行2个项目。

我正在使用:

frame = pd.read_csv("file_example.csv", names = [ 'W', 'X', 'Y', 'Z'])

有没有办法让它成为3个行填充W X和Z跳过Y然后离开NAN?并且类似地使得具有2个项目的行填充W和Z,跳过X和Y?现在它只是填写它遇到的第一列。

换句话说,有没有办法根据行中的项目数来选择要填充的行?

感谢。

编辑: 输入(对应于输出):

2,seafood,21418

2,stews,24126

2,seafood,23287

2,sandwiches,17429

4,6237

4,30815

4,5321

4,49248

尝试下面的方法,我将每个4,3,2项行放置100条测试线。 输出的示例部分:

3项目行:

 2     seafood     21418.0  21418

 2       stews     24126.0  24126

 2     seafood     23287.0  23287

 2  sandwiches     17429.0  17429

2项目行:

 4        6237         NaN   6237

 4        30815         NaN  30815

 4        5321         NaN   5321

 4       49248         NaN  49248

z正确填充,但NaN没有掩盖。

编辑2:未将新数据帧分配给变量。解决方案有效。

1 个答案:

答案 0 :(得分:0)

import numpy as np
import pandas as pd
df = pd.read_csv('test.csv', names=['W', 'X', 'Y', 'Z'])
df
Out: 
    W       X           Y       Z
0  10    Blue  20160809.0   203.0
1  12     Red  20160810.0  4578.0
2   9     Red      3094.0     NaN
3  15  Yellow       109.0     NaN
4   1      86         NaN     NaN
5   5    9384         NaN     NaN
6  56    3490         NaN     NaN

记录NaN的位置:

nans = df.isnull().values

填写Z栏:

df['Z'] = df['Z'].fillna(df['Y'].fillna(df['X']))

将NaNs向左移动:

df.mask(np.roll(nans, -1), np.nan)
Out: 
    W       X           Y     Z
0  10    Blue  20160809.0   203
1  12     Red  20160810.0  4578
2   9     Red         NaN  3094
3  15  Yellow         NaN   109
4   1     NaN         NaN    86 
5   5     NaN         NaN  9384
6  56     NaN         NaN  3490