亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

通過“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 關注
  • 304 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號