使用 pandas 进行数据清理

问题描述 投票:0回答:1
      A        B
0    Abel      10
1    Ada        8
2    Beed      15
3    Calvin    13
4     NaN       6
5     NaN      17
6     NaN      35
7     NaN      12
8     NaN      20
9     NaN      19

我想用 NaN 值填充单元格,其中非 NaN 值从索引 0 循环到索引 3。

import pandas as pd
data = {'A': ['Abel', 'Ada', 'Beed', 'Calvin', np.nan, np.nan, np.nan, np.nan, np.nan, np.nan],

'B': [10, 8, 15, 13, 6, 17, 35, 12, 20, 19]}
df = pd.DataFrame(data)

fill_values = df['A'].dropna().tolist()

df['A'] = df['A'].fillna(pd.Series(fill_values * (len(df) // len(fill_values) + 1))[:len(df)])
print(df)

它填充了 NaN 单元格,但没有从第一个索引开始循环。它用之前的值填充它。

预期产量

      A        B
0    Abel      10
1    Ada        8
2    Beed      15
3    Calvin    13
4    Abel       6
5    Ada       17
6    Beed      35
7    Calvin    12
8    Abel      20
9    Ada       19
python pandas dataframe series
1个回答
0
投票

我们需要修改代码以从

fill_values
列表的第一个索引开始填充 NaN 值。我们可以使用
itertools.cycle
函数创建一个循环遍历
fill_values
列表的迭代器。

这是修改后的代码:

import pandas as pd
import numpy as np
import itertools

data = {'A': ['Abel', 'Ada', 'Beed', 'Calvin', np.nan, np.nan, np.nan, np.nan, np.nan, np.nan],
        'B': [10, 8, 15, 13, 6, 17, 35, 12, 20, 19]}

df = pd.DataFrame(data)

fill_values = df['A'].dropna().tolist()

# Create a cycler that starts from the first index of fill_values
fill_cycler = itertools.cycle(fill_values)

# Fill NaN values with the cycler
df['A'] = df['A'].fillna(next(fill_cycler) for _ in range(len(df)))

print(df)

此代码创建一个从

fill_values
的第一个索引开始的循环器,并用该循环器填充“A”列中的 NaN 值。

输出:

      A   B
0   Abel  10
1    Ada   8
2   Beed  15
3  Calvin  13
4   Abel   6
5    Ada  17
6   Beed  35
7  Calvin  12
8   Abel  20
9    Ada  19

请注意,我使用

next
函数从循环器中获取“A”列中每个 NaN 值的下一个值。这确保填充从
fill_values
的第一个索引开始。

© www.soinside.com 2019 - 2024. All rights reserved.