通过“for”循环拆分熊猫数据帧会导致错误:KeyError: 'the label [1]

我有一个这样的 ecel 表:


A    B    C    D

          9    someString

          9    someString

1    5         someString

2    6         someString

100  7         someString

101  8         someString

现在我试图将它分成两个数据帧:


df = df[df['C'].isnull()]

for i in range(0, len(df)-1):

    if (df.loc[i+1,'A'] - df.loc[i,'A']) >= 10:

        df1 = df.iloc[:i+1, :]

        df2 = df.iloc[i+1:, :]

    else:

        pass

print(df1)

print(df2)

我正在努力实现的目标:


df1:


A    B    C    D

1    5   NaN   someString

2    6   NaN   someString

df2:


A    B    C    D

100  7   NaN   someString

101  8   NaN   someString

这导致问题: KeyError: 'the label [1] is not in the [index]'


我想这是因为isnull()功能的原因,但我不知道该怎么做。这里可能需要一些帮助。


Cats萌萌
浏览 259回答 2
2回答

德玛西亚99

避免可变数量的变量改用字典。例如,您可以使用itertools.count为连续的数据帧生成键,并pd.Series.diff确定在何处进行拆分的索引。拆分本身可以使用 进行处理np.split。from itertools import countc = count()dfs = {}c_valid = df['C'].notnull()dfs[next(c)] = df[c_valid]split_indices = np.where(df.loc[~c_valid, 'A'].diff() > 10)[0]for df_split in np.split(df[~c_valid], split_indices):    dfs[next(c)] = df_split结果:print(*dfs.items(), sep='\n'*2)(0,     A   B    C0 NaN NaN  9.01 NaN NaN  9.0)(1,      A    B   C2  1.0  5.0 NaN3  2.0  6.0 NaN)(2,        A    B   C4  100.0  7.0 NaN5  101.0  8.0 NaN)

慕森卡

当您划分两个数据帧时,索引会得到保留,如果您打印第二个数据帧,您会看到索引中没有“1”:df2>>     A    B   C4  100  7.0 NaN5  101  8.0 NaN您可以使用iloc访问第一行:df2.iloc[0]>>A    101.0B      8.0C      NaNName: 5, dtype: float64另外,一条建议:避免for在熊猫中使用。对于您的情况,.diff如果要在“A”跳转时拆分数据库,请使用:ix=df[df.diff()['A']>10].index[-1]ix>> 4df1, df2 = df.loc[:ix-1], df.loc[ix:]
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python