使用条件groupby创建python数据帧

时间:2018-01-23 15:14:55

标签: python pandas dataframe

我有以下数据:

year code   value  
2003  A      12  
2003  B      11  
2003  C      12  
2004  A      14  
2004  B      15  
2004  C      13  
2004  E      16  
2005  A      9  
2005  B      18  
2005  C      16  
2005  F      8  
2005  G      19  

我只想保留每年都存在的代码。

从上面的数据框中,我需要提取所有具有代码的行(2003,2004,2005)。这意味着我应该为代码A,B和C创建一个包含9行的新df。我尝试使用groupby和isin()但无法得到我需要的内容。

4 个答案:

答案 0 :(得分:2)

没有val words = Array("one", "two", "two", "three", "three", "three") val wordPairsRDD = sc.parallelize(words).map(word => (word, 1)) val wordCountsWithReduce = wordPairsRDD .reduceByKey(_ + _) .collect() val wordCountsWithGroup = wordPairsRDD .groupByKey() .map(t => (t._1, t._2.sum)) .collect()

groupby

答案 1 :(得分:1)

我认为您需要按isin进行过滤,但如果想要动态获取所有年份的所有值,请使用reduce

s = df.groupby('year')['code'].apply(list)

from functools import reduce
a = reduce(lambda x, y: set(x) & set(y), s)
print (list(a))
['C', 'A', 'B']

df = df[df['code'].isin(list(a))]
print (df)
   year code  value
0  2003    A     12
1  2003    B     11
2  2003    C     12
3  2004    A     14
4  2004    B     15
5  2004    C     13
7  2005    A      9
8  2005    B     18
9  2005    C     16

答案 2 :(得分:1)

您还可以尝试基于query的方法。

$.each($('a'), function() {
  $.each(this.attributes, function() {
    if ( this.name.indexOf('data-ajax') === 0 ) {
      // Do somethng with this.value
    }
  });
});

答案 3 :(得分:1)

您可以使用

选项1

In [647]: codes = pd.crosstab(df.year, df.code).replace({0: np.nan}).dropna(axis=1).columns

In [648]: df.query('code in @codes')
Out[648]:
   year code  value
0  2003    A     12
1  2003    B     11
2  2003    C     12
3  2004    A     14
4  2004    B     15
5  2004    C     13
7  2005    A      9
8  2005    B     18
9  2005    C     16

选项2

In [657]: codes = df.groupby(['year', 'code']).size().unstack().dropna(axis=1).columns

In [658]: df[df.code.isin(codes)]
Out[658]:
   year code  value
0  2003    A     12
1  2003    B     11
2  2003    C     12
3  2004    A     14
4  2004    B     15
5  2004    C     13
7  2005    A      9
8  2005    B     18
9  2005    C     16