2016-12-03 99 views
1

列我有一個數據幀,例如:大熊貓轉換分組的行爲

label column1 
    a   1 
    a   2 
    b   6 
    b   4 

我想從那裏COLUMN1標籤匹配使數據幀與新列,與對面的價值。如:

label column1 column2 
    a   1   2 
    a   2   1 
    b   6   4 
    b   4   6 

我知道這可能是一個groupby命令很簡單,但我一直在搜索,找不到任何東西。

回答

0

的以下使用groupbyapply似乎工作好嗎:

x = pd.DataFrame({ 'label': ['a','a','b','b'], 
        'column1': [1,2,6,4] }) 

y = x.groupby('label').apply(
    lambda g: g.assign(column2 = np.asarray(g.column1[::-1]))) 
y = y.reset_index(drop=True) # optional: drop weird index 

print(y) 
+0

這個工作。謝謝! – jrich

0

你可以試試下面的代碼塊:

#create the Dataframe 
df = pd.DataFrame({'label':['a','a','b','b'], 
        'column1':[1,2,6,4]}) 

#Group by label 
a = df.groupby('label').first().reset_index() 
b = df.groupby('label').last().reset_index() 

#Concat those groups to create columns2 
df2 = (pd.concat([b,a]) 
     .sort_values(by='label') 
     .rename(columns={'column1':'column2'}) 
     .reset_index() 
     .drop('index',axis=1)) 

#Merge with the original Dataframe 
df = df.merge(df2,left_index=True,right_index=True,on='label')[['label','column1','column2']] 

希望這有助於

0

假設他們只對標籤,你可以使用下面的還有:

# Create dataframe 
df = pd.DataFrame(data = {'label' :['a', 'a', 'b', 'b'], 
       'column1' :[1,2, 6,4]}) 
# iterate over dataframe, identify matching label and opposite value 
for index, row in df.iterrows(): 
    newvalue = int(df[(df.label == row.label) & (df.column1 != row.column1)].column1.values[0]) 
    # set value to new column 
    df.set_value(index, 'column2', newvalue) 

df.head() 
0

您可以使用groupbyapply那裏帶回爲了創造新的Series

df['column2'] = df.groupby('label')["column1"] \ 
        .apply(lambda x: pd.Series(x[::-1].values)).reset_index(drop=True) 

print (df) 
    column1 label column2 
0  1  a  2 
1  2  a  1 
2  6  b  4 
3  4  b  6