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