2016-12-03 2 views
1

У меня есть dataframe, такие как:панд преобразующей сгруппированы строки в столбцы

label column1 
    a   1 
    a   2 
    b   6 
    b   4 

Я хотел бы сделать dataframe с новой колонкой, с противоположным значением от column1, где спичечных этикеток. Такие как:

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

Я знаю, что это, вероятно, очень просто сделать с командой groupby, но я искал и ничего не нашел.

ответ

0

следующие виды использования groupby и apply и, похоже, работают нормально:

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

Вы можете использовать groupby с apply где создать новый 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 
Смежные вопросы