通过“ for”循环拆分熊猫数据框会导致错误:KeyError:'标签[1]不在[索引]中'

时间:2019-01-16 15:39:23

标签: python python-3.x pandas

我有一个这样的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()函数引起的,但是我不知道该怎么做。这里可能需要一些帮助。

2 个答案:

答案 0 :(得分:1)

避免变量数量可变

请改用字典。例如,您可以使用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)

答案 1 :(得分:0)

当划分两个数据帧时,索引将保留,如果打印第二个数据帧,则会看到索引中没有“ 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。对于您的情况,如果要在'A'跳转时拆分数据库,请使用.diff

ix=df[df.diff()['A']>10].index[-1]
ix
>> 4
df1, df2 = df.loc[:ix-1], df.loc[ix:]