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
我们需要修改代码以从
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
的第一个索引开始。