问题描述
我正在尝试创建一个函数,该函数可以用不同的数字刻度填充多个系列中的缺失数字,并同时为每个系列生成一个常数列。
from tika import parser
import pandas as pd
import numpy as np
import io
rawtext = parser.from_file('D:\Selenium\Texto.txt')
text = rawtext['content']
f = io.StringIO(text)
f.readline()
data = f.read()
f.readline()
def fill(d):
idx = range(d['col1'].min(),d['col1'].max() + 1)
return d.set_index('col1').reindex(idx,method='ffill').reset_index()
g = df['col1'].lt(df['col1'].shift()).cumsum()
df = pd.concat([fill(g) for k,g in df.groupby(g)],ignore_index=True)
print(df)
是否可以用Pandas创建以下功能?
示例数据框:
1029 400
1035 400
1031 340
1039 340
1020 503
1025 503
预期输出:
1029 400
1030 400
1031 400
1032 400
1033 400
1034 400
1035 400
1031 340
1032 340
1033 340
1034 340
1035 340
1036 340
1037 340
1038 340
1039 340
1020 503
1021 503
1022 503
1023 503
1024 503
1025 503
解决方法
def fill(d):
idx = range(d['col1'].min(),d['col1'].max() + 1)
return d.set_index('col1').reindex(idx,method='ffill').reset_index()
g = df['col1'].lt(df['col1'].shift()).cumsum()
df = pd.concat([fill(g) for k,g in df.groupby(g)],ignore_index=True)
详细信息:
标识col1
中所有缺少值的单调递增部分。可以借助Series.lt
+ Series.shift
和Series.cumsum
来创建石斑鱼g
:
print(g)
0 0
1 0
2 1
3 1
4 2
5 2
Name: col1,dtype: int64
然后groupby
使用此分组器上的数据框,并使用自定义定义函数为每个分组的框fill
使用空白,该自定义函数利用数据框的reindex
方法来填充缺失值
print(fill(g)) # sample filled values for first group
col1 col2
0 1029 400
1 1030 400
2 1031 400
3 1032 400
4 1033 400
5 1034 400
6 1035 400
最后使用pd.concat
,在填充缺失值后将所有这些分组的帧连接起来。
print(df)
col1 col2
0 1029 400
1 1030 400
2 1031 400
3 1032 400
4 1033 400
5 1034 400
6 1035 400
7 1031 340
8 1032 340
9 1033 340
10 1034 340
11 1035 340
12 1036 340
13 1037 340
14 1038 340
15 1039 340
16 1020 503
17 1021 503
18 1022 503
19 1023 503
20 1024 503
21 1025 503