我有一个数据框(df
),其列名为Id
,看起来像
Id
0 3
1 67
2 356
3
:
50 P4
51 P5
52 678
53
54 2
该列的类型为:dtype: object
我已经计算出最大Id值,并分配给名为maxId的变量(即678,并希望对空元素应用按顺序递增的maxId,因此在此示例中,我的输出将是:
Id
0 3
1 67
2 356
3 679
:
50 P4
51 P5
52 678
53 680
54 2
在元素3和53中分别分配了值679和680。
我尝试了以下代码,在其中遍历整个列寻找空元素,然后将maxId应用于这些元素:
for item, frame in df['Id'].iteritems():
if pd.isnull(frame):
maxId = maxId + 1
frame['Id'] = maxId
但是得到错误:
TypeError: 'float' object is not subscriptable
有人可以为我需要解决的问题提供一些帮助。
谢谢
答案 0 :(得分:2)
# calculate maximum value
maxId = int(pd.to_numeric(df['Id'], errors='coerce').max())
# calculate Boolean series of nulls
nulls = df['Id'].isnull()
# assign range starting from one above maxId
df.loc[nulls, 'Id'] = np.arange(maxId + 1, maxId + 1 + nulls.sum())
print(df)
# Id
# 0 3
# 1 67
# 2 356
# 3 679
# 50 P4
# 51 P5
# 52 678
# 53 680
# 54 2
答案 1 :(得分:1)
正如您所说的,您已经知道maxId了,您可以尝试使用此矢量化解决方案:
>>df
Id
0 3
1 67
2 356
3 NaN
5 P4
6 P5
7 678
8 NaN
9 2
n = 678
n=n+1
df.loc[df.Id.isnull(), 'Id'] = list(np.arange(n,n+len(df.Id[df.Id.isna()].values)))
>>df
输出:
Id
0 3
1 67
2 356
3 679
5 P4
6 P5
7 678
8 680
9 2
答案 2 :(得分:0)
您是否需要像'P4'和'P5'这样的值?我试图重现与您类似的DataFrame,但没有这些值,它就可以正常工作:
df = pd.DataFrame({'A' : [20,4, np.nan, np.nan, 12, np.nan, 6, 10]})
maxID = df['A'].max()
for i in range (len(df['A'])):
if pd.isnull(df['A'].loc[i]):
maxID +=1
df['A'].loc[i] = maxID
我认为发生错误是因为您试图访问float的元素,例如使用列表。
示例:
my_float = 3.0
my_float[0]
TypeError: 'float' object is not subscriptable