大熊猫转换分组的行为
问题描述:
列我有一个数据帧,例如:大熊猫转换分组的行为
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命令很简单,但我一直在搜索,找不到任何东西。
答
的以下使用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)
答
你可以试试下面的代码块:
#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']]
希望这有助于
答
假设他们只对标签,你可以使用下面的还有:
# 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()
这个工作。谢谢! – jrich