将行合并在Pandas中

42

我有一个DataFrame,它有一个名为city_id的索引,格式为[城市],[州](例如,new york,ny),它包含在列中的整数计数。问题是,同一城市的多行具有相同的city_id,我想通过添加它们的列值来合并共享city_id的行。我查看了groupby(),但不清楚如何将其应用于此问题。

编辑:

举个例子:

city_id    val1 val2 val3
houston,tx    1    2    0
houston,tx    0    0    1
houston,tx    2    1    1

变成这个样子:

city_id    val1 val2 val3
houston,tx    3    3    2

如果有大约10-20k行。


10
这并不是一个重复的问题,@DSM 的回答 df.groupby(df.index) 在重复的问题中也没有出现。 - LondonRob
2个回答

54

从以下开始

>>> df
              val1  val2  val3
city_id                       
houston,tx       1     2     0
houston,tx       0     0     1
houston,tx       2     1     1
somewhere,ew     4     3     7

我可能会做

>>> df.groupby(df.index).sum()
              val1  val2  val3
city_id                       
houston,tx       3     3     2
somewhere,ew     4     3     7

或者

>>> df.reset_index().groupby("city_id").sum()
              val1  val2  val3
city_id                       
houston,tx       3     3     2
somewhere,ew     4     3     7

第一种方法将索引值(在本例中是city_id值)传递给groupby,并告诉它将其用作分组键,第二种方法则重置索引,然后选择city_id列。有关更多示例,请参见文档中的此部分。请注意,DataFrameGroupBy对象中还有许多其他方法:

>>> df.groupby(df.index)
<pandas.core.groupby.DataFrameGroupBy object at 0x1045a1790>
>>> df.groupby(df.index).max()
              val1  val2  val3
city_id                       
houston,tx       2     2     1
somewhere,ew     4     3     7
>>> df.groupby(df.index).mean()
              val1  val2      val3
city_id                           
houston,tx       1     1  0.666667
somewhere,ew     4     3  7.000000

有没有办法选择其组中平均值最大的行?在这个例子中,它应该从第一组选择 houston,tx 2 1 1 - Morteza Milani
有没有一种方法可以定义一个列求和,另一个列取最大值,另一个列取最小值,以便结果为 Huston, TX 3(求和),2(最大值),1(最小值)? - MrKingsley

5

有一些与此类似的内容。对不起,不是完全的复制品。

mydata = [{'subid' : 'B14-111', 'age': 75, 'fdg':1.78},
          {'subid' : 'B14-112', 'age': 22, 'fdg':1.56},{'subid' : 'B14-112', 'age': 40, 'fdg':2.00},]
df = pandas.DataFrame(mydata)

gg = df.groupby("subid",sort=True).sum()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接