保持关键'在pandas中使用groupby和transform时的列

时间:2016-10-19 18:39:09

标签: python pandas

查找规范化数据帧会删除用于分组的列,以便不能在后续的groupby操作中使用它。例如(编辑:更新):

    df = pd.DataFrame({'a':[1, 1 , 2, 3, 2, 3], 'b':[0, 1, 2, 3, 4, 5]})

       a  b
    0  1  0
    1  1  1
    2  2  2
    3  3  3
    4  2  4
    5  3  5

    df.groupby('a').transform(lambda x: x)

       b
    0  0
    1  1
    2  2
    3  3
    4  4
    5  5

现在,对于群组中的大多数操作,“'缺失' column成为一个新索引(可以使用reset_index进行调整,或者设置as_index=False),但是当使用transform时它会消失,留下原始索引和没有键的新数据集。

编辑:这是我希望能够做到的一个方面

    df.groupby('a').transform(lambda x: x+1).groupby('a').mean()
    KeyError 'a'

pandas docs的示例中,一个函数用于根据索引进行拆分,这似乎完全避免了这个问题。或者,总是可以在groupby / transform之后添加列,但肯定有更好的方法吗?

更新: 看起来reset_index / as_index仅适用于将每个组缩减为单个行的函数。似乎有几个选项,来自答案

4 个答案:

答案 0 :(得分:2)

该问题也在here中进行了讨论。

返回的对象与原始df具有相同的索引,因此您可以这样做

Private Sub edit_Click(sender As Object, e As EventArgs) Handles edit.Click
    If ComboBox3.SelectedItem = "vehicule" Then
        Cn.Open()
        cmdb = New SqlCommandBuilder(da)
        da.Update(ds, "vehicule")
        Cn.Close()
    ElseIf ComboBox3.SelectedItem = "tissu" Then
        Cn.Open()
        cmdb = New SqlCommandBuilder(da1)
        da1.Update(ds, "tissu")
        Cn.Close()
    ElseIf ComboBox3.SelectedItem = "projet" Then
        Cn.Open()
        cmdb = New SqlCommandBuilder(da2)
        da2.Update(ds, "projet")
        Cn.Close()
    ElseIf ComboBox3.SelectedItem = "kit_cover" Then
        Cn.Open()
        cmdb = New SqlCommandBuilder(da3)
        da3.Update(ds, "kit_cover")
        Cn.Close()
    ElseIf ComboBox3.SelectedItem = "plan coupe" Then
        Cn.Open()
        cmdb = New SqlCommandBuilder(da4)
        da4.Update(ds, "plan de coupe")
        Cn.Close()
    End If
End Sub

答案 1 :(得分:1)

那是古怪的!

我像这样欺骗它

df.groupby(df.a.values).transform(lambda x: x)

enter image description here

答案 2 :(得分:1)

另一种类似于Pepacz建议的方法:

df.loc[:, df.columns.drop('a')] = df.groupby('a').transform(lambda x: x)

答案 3 :(得分:0)

试试这个:

df['b'] = df.groupby('a').transform(lambda x: x)
df.drop_duplicates()