簡體   English   中英

如何串聯pandas.DataFrames列

[英]How to concatenate pandas.DataFrames columns

我有一個稱為raw_df

columns = ['force0', 'distance0', 'force1', 'distance1']

raw_data = [{'force0': 1.2, 'distance0': 0.0, 'force1': 0.5, 'distance1': 0.0},
            {'force0': 1.3, 'distance0': 0.1, 'force1': 0.6, 'distance1': 0.0},
            {'force0': 1.4, 'distance0': 0.2, 'force1': 0.7, 'distance1': 0.3},
            {'force0': 1.5, 'distance0': 0.5, 'force1': 0.8, 'distance1': 0.6}]

raw_df = pd.DataFrame(raw_data, columns=columns)

raw_df看起來像這樣:

   force0  distance0  force1  distance1
0     1.2        0.0     0.5        0.0
1     1.3        0.1     0.6        0.0
2     1.4        0.2     0.7        0.3
3     1.5        0.5     0.8        0.6

目前沒有索引,但我希望將distance列合並為一個索引,因此這些列為:

          force0  force1
distance                
0.0          1.2     0.5
0.0          NaN.    0.6
0.1          1.3     NaN
0.2          1.4     NaN
0.3          NaN     0.7
0.5          1.5     NaN
0.6          NaN     0.8

請注意,在force1中,距離1 = 0.0有2個條目。

索引(距離)不應排序:它們先升后降,而每個測試的原始順序很重要。

斯特凡(Stefan)對我的問題描述得不好的問題發表了一個驚人的答案,但似乎用其他數字填補了所有缺失的力(這會產生誤導,因為在那些測試中沒有針對這些距離的力測量值)。 我使用np.nan來缺少值,因為我認為這是pandas所做的。

我認為mergejoin可能會滿足我的需要,但無法理解文檔

也許pandas.DataFrame不是為此類數據而設計的,我應該改用numpy.genfromtxt並隨便選擇我需要的列:如果我要選擇pandas.DataFrame列,我看不出任何好處飛(因為在這種情況下我不使用索引)。

謝謝你的幫助。

如果我理解正確,那么您是從類似於以下情況開始的:

columns = list(sum(list(zip(['Forces{}'.format(i) for i in range(4)], ['Distances{}'.format(i) for i in range(4)])), ()))
df = pd.DataFrame(np.random.randint(1, 11, size=(100, 8)), columns=columns)

   Forces0  Distances0  Forces1  Distances1  Forces2  Distances2  Forces3  \
0        3           5        8           3        7           4        2   
1        1           4       10           9        9           3        6   
2       10           3        1           3        3           7        8   
3        2           1        3           6       10          10       10   
4        4           2        9           1        3          10        8   

   Distances3  
0           8  
1           5  
2           3  
3           8  
4           8  

並且您的目標是讓各種Distance列構成一個index而相應的Force columns remain in place. You could columns remain in place. You could像這樣堆疊框架:

df.set_index([c for c in df.columns if c.startswith('Force')], inplace=True)
df = df.stack().reset_index(level=-1, drop=True).reset_index().rename(columns={0: 'Distance'})
df.set_index(['Distance'], inplace=True)

要得到:

          Forces0  Forces1  Forces2  Forces3
Distance                                    
9               7        4        6        7
9               7        4        6        7
1               7        4        6        7
6               7        4        6        7
5               1        2        3        1

我使用MultiIndex DataFrame解決了問題:

  1. 使用pd.read_csv()將每個測試讀入單獨的DataFrame中
  2. 使用df = pd.concat(frame_list, keys=test_names)將DataFrames合並為一個

我沒有在這里寫詳細說明,而是在主題上寫了一個Jupyter筆記本 ,將MultiIndex方法與僅保留標准Python DataFrames列表進行了比較。

暫無
暫無

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

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