簡體   English   中英

根據列中的一組參數將數據框拆分為多個數據框

[英]Split data frame into multiple data frames based on a group of parameters in a column

我有一個這樣的數據框:

東風

ID      A       B       C
00      X0      Y0      PARAMETER_0
01      X1      Y1      PARAMETER_1
02      X2      Y2      PARAMETER_2
03      X3      Y3      PARAMETER_3
04      X4      Y4      PARAMETER_4
05      X5      Y5      PARAMETER_0
06      X6      Y6      PARAMETER_1
07      X7      Y7      PARAMETER_2
08      X8      Y8      PARAMETER_3
09      X9      Y9      PARAMETER_4
10      XX0     YY0     PARAMETER_0
11      XX1     YY1     PARAMETER_1
12      XX2     YY2     PARAMETER_2
13      XX3     YY3     PARAMETER_3
14      XX4     YY4     PARAMETER_4

而且我需要通過C列中的PARAMETER_4將其拆分為多個數據幀,以獲得:

DF_1

ID      A       B       C
00      X0      Y0      PARAMETER_0
01      X1      Y1      PARAMETER_1
02      X2      Y2      PARAMETER_2
03      X3      Y3      PARAMETER_3
04      X4      Y4      PARAMETER_4

DF_2

05      X5      Y5      PARAMETER_0
06      X6      Y6      PARAMETER_1
07      X7      Y7      PARAMETER_2
08      X8      Y8      PARAMETER_3
09      X9      Y9      PARAMETER_4

DF_3

10      XX0     YY0     PARAMETER_0
11      XX1     YY1     PARAMETER_1
12      XX2     YY2     PARAMETER_2
13      XX3     YY3     PARAMETER_3
14      XX4     YY4     PARAMETER_4

我找不到像df.split(axis=0, value='PARAMETER_4')這樣的簡單函數

關於方法的任何想法? 先感謝您!

您可以使用比較PARAMETER_4創建輔助array ,通過索引和dictionary of DataFrame累積和來交換值:

s = pd.factorize(df['C'].eq('PARAMETER_4').iloc[::-1].cumsum().sort_index())[0] + 1

print (s)
[1 1 1 1 1 2 2 2 2 2 3 3 3 3 3] 

dfs = dict(tuple(df.groupby(s)))
print (dfs[1])
   ID   A   B            C
0   0  X0  Y0  PARAMETER_0
1   1  X1  Y1  PARAMETER_1
2   2  X2  Y2  PARAMETER_2
3   3  X3  Y3  PARAMETER_3
4   4  X4  Y4  PARAMETER_4

您需要的是可能的,但不推薦

s = df['C'].eq('PARAMETER_4').iloc[::-1].cumsum()
for i, g in df.groupby(s):
    globals()[f'DF_{i}'] =  g

print (DF_1)
   ID   A   B            C
0   0  X0  Y0  PARAMETER_0
1   1  X1  Y1  PARAMETER_1
2   2  X2  Y2  PARAMETER_2
3   3  X3  Y3  PARAMETER_3
4   4  X4  Y4  PARAMETER_4

另一個想法是檢查c列並按由GroupBy.cumcount創建的計數器系列進行分組:

s = df.groupby('C').cumcount() + 1

dfs = dict(tuple(df.groupby(s)))
print (dfs[1])
   ID   A   B            C
0   0  X0  Y0  PARAMETER_0
1   1  X1  Y1  PARAMETER_1
2   2  X2  Y2  PARAMETER_2
3   3  X3  Y3  PARAMETER_3
4   4  X4  Y4  PARAMETER_4

我們可以在這里使用groupby兩次。 首先,我們在C列上進行分組並進行cumcount 然后我們對這個 cumcount 進行分組以獲取單獨的數據幀:

dfs = [d for _, d in df.groupby(df.groupby('C').cumcount())]

print(dfs[0], '\n')
print(dfs[1], '\n')
print(dfs[2])

輸出


   ID   A   B            C
0   0  X0  Y0  PARAMETER_0
1   1  X1  Y1  PARAMETER_1
2   2  X2  Y2  PARAMETER_2
3   3  X3  Y3  PARAMETER_3
4   4  X4  Y4  PARAMETER_4 

   ID   A   B            C
5   5  X5  Y5  PARAMETER_0
6   6  X6  Y6  PARAMETER_1
7   7  X7  Y7  PARAMETER_2
8   8  X8  Y8  PARAMETER_3
9   9  X9  Y9  PARAMETER_4 

    ID    A    B            C
10  10  XX0  YY0  PARAMETER_0
11  11  XX1  YY1  PARAMETER_1
12  12  XX2  YY2  PARAMETER_2
13  13  XX3  YY3  PARAMETER_3
14  14  XX4  YY4  PARAMETER_4

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM