为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Cats萌萌 2021-10-12 16:25:03
我有一个这样的 ecel 表:A    B    C    D          9    someString          9    someString1    5         someString2    6         someString100  7         someString101  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:        passprint(df1)print(df2)我正在努力实现的目标:df1:A    B    C    D1    5   NaN   someString2    6   NaN   someStringdf2:A    B    C    D100  7   NaN   someString101  8   NaN   someString这导致问题: KeyError: 'the label [1] is not in the [index]'我想这是因为isnull()功能的原因,但我不知道该怎么做。这里可能需要一些帮助。
查看完整描述

2 回答

?
德玛西亚99

TA贡献1770条经验 获得超3个赞

避免可变数量的变量

改用字典。例如,您可以使用itertools.count为连续的数据帧生成键,并pd.Series.diff确定在何处进行拆分的索引。拆分本身可以使用 进行处理np.split。


from itertools import count


c = 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    C

0 NaN NaN  9.0

1 NaN NaN  9.0)


(1,      A    B   C

2  1.0  5.0 NaN

3  2.0  6.0 NaN)


(2,        A    B   C

4  100.0  7.0 NaN

5  101.0  8.0 NaN)


查看完整回答
反对 回复 2021-10-12
?
慕森卡

TA贡献1806条经验 获得超8个赞

当您划分两个数据帧时,索引会得到保留,如果您打印第二个数据帧,您会看到索引中没有“1”:


df2

>>     A    B   C

4  100  7.0 NaN

5  101  8.0 NaN

您可以使用iloc访问第一行:


df2.iloc[0]

>>A    101.0

B      8.0

C      NaN

Name: 5, dtype: float64

另外,一条建议:避免for在熊猫中使用。对于您的情况,.diff如果要在“A”跳转时拆分数据库,请使用:


ix=df[df.diff()['A']>10].index[-1]

ix

>> 4

df1, df2 = df.loc[:ix-1], df.loc[ix:]


查看完整回答
反对 回复 2021-10-12
  • 2 回答
  • 0 关注
  • 258 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信