簡體   English   中英

如何在熊貓數據框中交換兩列並翻轉第三列?

[英]how to swap two columns and flip a third in panda data frame?

我正在進行一個實驗(使用 python 2.7,panda 0.23.4),其中我有三個級別的刺激 {a,b,c} 並向參與者展示所有不同的組合,他們必須選擇哪個更粗糙? (例如:刺激 1 = a ,刺激 2=b,參與者選擇 1 表示刺激 1 更粗糙)

實驗后,我有一個包含三列的數據框,如下所示:

import pandas as pd

d = {'Stim1':  ['a', 'b', 'a', 'c', 'b', 'c'],
     'Stim2': ['b', 'a', 'c', 'a', 'c', 'b'],
     'Answer': [1, 2, 2, 1, 2, 1]}
df = pd.DataFrame(d)

        Stim1  Stim2  Answer
    0     a     b      1
    1     b     a      2
    2     a     c      2
    3     c     a      1
    4     b     c      2
    5     c     b      1 

對於我的分析,刺激先出現的順序並不重要。 Stim1= a, Stim2= b 與 Stim1= b, Stim2= a 相同。 我想弄清楚如何交換 Stim1 和 Stim2 並將它們的答案翻轉為這樣:

        Stim1  Stim2  Answer
    0     a     b      1
    1     a     b      1
    2     a     c      2
    3     a     c      2
    4     b     c      2
    5     b     c      2

我讀到np.where可以使用,但它一次只做一件事,我想做兩件事(交換和翻轉)。

有沒有辦法使用另一個函數同時進行交換和翻轉?

你能試試這對你有用嗎?

import pandas as pd
import numpy as np

df = pd.DataFrame(d)

# keep a copy of the original Stim1 column
s = df['Stim1'].copy()

# sort the values
df[['Stim1', 'Stim2']] = np.sort(df[['Stim1', 'Stim2']].values)

# exchange the Answer if the order has changed
df['Answer'] = df['Answer'].where(df['Stim1'] == s, df['Answer'].replace({1:2,2:1}))

輸出:

  Stim1 Stim2  Answer
0     a     b       1
1     a     b       1
2     a     c       2
3     a     c       2
4     b     c       2
5     b     c       2

您可以首先構建一個布爾系列,指示應交換或不交換哪些行:

>>> swap = df['Stim1'] > df['Stim2']
>>> swap
0    False
1     True
2    False
3     True
4    False
5     True
dtype: bool

然后構建完全交換的數據幀,如下所示:

>>> swapped_df = pd.concat([
...     df['Stim1'].rename('Stim2'),
...     df['Stim2'].rename('Stim1'),
...     3 - df['Answer'],
... ], axis='columns')
>>> swapped_df
  Stim2 Stim1  Answer
0     a     b       2
1     b     a       1
2     a     c       1
3     c     a       2
4     b     c       1
5     c     b       2

最后,使用.mask()選擇初始行或交換行:

>>> df.mask(swap, swapped_df)
  Stim1 Stim2  Answer
0     a     b       1
1     a     b       1
2     a     c       2
3     a     c       2
4     b     c       2
5     b     c       2

NB .mask是大致相同的.where ,但它代替行,其中該系列產品是True的而不是保留了那些行True 這是完全一樣的:

>>> swapped_df.where(swap, df)
  Stim2 Stim1  Answer
0     b     a       1
1     b     a       1
2     c     a       2
3     c     a       2
4     c     b       2
5     c     b       2

暫無
暫無

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

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