【问题标题】:Pandas - fill specific number of rows in a column with one valuePandas - 用一个值填充列中的特定行数
【发布时间】:2017-07-12 00:19:49
【问题描述】:

我有一个 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?) 来填充该列,但是这些数字会在我运行代码的每个文件上发生变化,因此它需要足够强大任意取任何出现的数字并将它们排列在正确的行中。

感谢您的帮助。

【问题讨论】:

  • Nan 值呢?您是否也需要更换它们?
  • @SayPy NaN 不是我最关心的问题。只需将这些价格值与其正确的行对齐即可

标签: python pandas numpy dataframe


【解决方案1】:

0's 和 None 替换为实际缺失值,然后沿行向前填充缺失值:

df[(df == '0') | (df == 'None')] = None
df = df.fillna(method = 'ffill', axis=1)

现在df['new_column2'] 包含您要回填的值。因此,只需使用fillna()backfill 方法来填补空白。

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
       ...          ...

【讨论】:

  • 嗯。您的最终打印输出看起来很完美。但是添加我收到的TypeError: Could not compare ['0'] with block values 指向fish_frame[(fish_frame == '0') | (fish_frame == 'None')] = None 行的代码
  • 好的。我认为这是因为您的数据框中的字符串包含空格。可能它们类似于.....0,而我假设它们是0。在替换缺失值之前尝试运行df = df.applymap(str.strip) 去除空格
  • 请检查df.dtypes列的数据类型。同样,我假设您的列是字符串,而不是浮点数。如果您的列是浮动的,那么您需要从 0s 和 None 周围删除引号,例如 fish_frame[(fish_frame == 0) | (fish_frame == None)] = None
  • 好的。这意味着您的列可能是混合数据类型。请检查这是否有效fish_frame[(fish_frame == 0)] = None0 周围没有引号)
【解决方案2】:

您可以使用 .iloc 方法并根据需要对索引范围进行切片 - 请参阅下面的代码 sn-p。

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

希望这就是您要找的。​​p>

【讨论】:

  • 哦,这只是从这些列中切出所有有效数字吗?
  • 因为如果是这样的话,它是非常强大和聪明的。无论这些新列中填充了哪些其他垃圾,都可以提取重要信息,我理解对吗?
  • 它最终没有工作。它只是打印了NaNs 的列
  • @theprowler 你一定是做错了什么,我在 Windows 机器上运行它,现在在家里 - 两次都运行良好。
  • 最后三行是应该添加的还是打印出来的?因为如果我必须手动输入原始数据框中的数字,它将无法正常工作,因为我必须在数百个文件上运行此代码。
【解决方案3】:

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值可以用你关心的任何值替换。

希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 2020-07-30
    • 2017-01-05
    • 2017-08-07
    • 2022-01-05
    • 1970-01-01
    • 2021-08-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多