我有一个40行的DataFrame列,完全由0
填充,除了三行上有数字。还有一列只有一个有价值的数字。
new_column new_column2
0 0 0
1 0 0
2 0 0
3 0 0
4 0 0
5 0 0
6 0 0
7 0 0
8 0 0
9 0 0
10 NaN $21,151.67
11 0 0
12 0 0
13 0 0
14 0 0
15 0 0
16 0 0
17 0 0
18 0 0
19 0 0
20 0 0
21 0 0
22 0 0
23 0 0
24 0 0
25 $58,500.00 None
26 0 0
27 0 0
28 0 0
29 0 0
30 0 0
31 0 0
32 0 0
33 0 0
34 0 0
35 0 0
36 0 0
37 0 0
38 0 0
39 0 0
40 $57,750.00 None
是否可以获取这些数量的值并用它们填充列,直到它们再次出现有价值的数字?
因此$21,151.67
将填充第1行到第10行的所有行。
$50,500.00
将填充第11-25行的所有行。
$57,750.00
会填写25-40行。
我知道我可以执行一个简单的命令,例如此处列出的命令(How do I fill a column with one value in Pandas?)来填充列,但是这些数字会在我运行代码的每个文件上发生变化,因此需要足够强大,可以随意取出任何数字,并将它们对齐在正确的行中。
感谢您的帮助。
答案 0 :(得分:3)
将0
和“无”替换为实际缺失值,然后沿行向前填充缺失值:
df[(df == '0') | (df == 'None')] = None
df = df.fillna(method = 'ffill', axis=1)
现在df['new_column2']
包含您要回填的值。因此,只需使用backfill
fillna()
方法填补空白。
df['new_column2'] = df['new_column2'].fillna(method = 'backfill')
df['new_column'] = df['new_column2']
给出:
new_column new_column2
0 $21,151.67 $21,151.67
1 $21,151.67 $21,151.67
2 $21,151.67 $21,151.67
3 $21,151.67 $21,151.67
4 $21,151.67 $21,151.67
5 $21,151.67 $21,151.67
6 $21,151.67 $21,151.67
7 $21,151.67 $21,151.67
8 $21,151.67 $21,151.67
9 $21,151.67 $21,151.67
10 $21,151.67 $21,151.67
11 $58,500.00 $58,500.00
12 $58,500.00 $58,500.00
... ...
答案 1 :(得分:0)
Pandas fillna功能为您提供了一个选项,可以将填充后退或前移到下一个/最后一个有效观察。 对于您的情况,您需要将None和NaN替换为有效值,然后将0替换为无效值(意味着np.nan)。然后你可以使用fillna和向后填充。
df[['foo', 'bar']].fillna('anker', inplace=True)
df[['foo', 'bar']].replace({0:np.nan})
df[['foo', 'bar']].fillna(methode='bfill')
然后可以用您关心的任何值替换剩余的anker值。
希望有所帮助。
答案 2 :(得分:0)
您可以使用.iloc
方法并根据需要对索引范围进行切片 - 请参阅下面的代码段。
import pandas as pd
df = pd.DataFrame(index=range(0, 40), columns=['new_column', 'new_column2'],
dtype='float')
df.iloc[0:10] = 21156.67
df.iloc[10:25] = 50500.00
df.iloc[25:40] = 57750.00
希望这就是你要找的东西。