从不同指数优化计数

时间:2017-08-09 06:03:04

标签: python pandas

我已经找到了解决问题的方法,但我正在寻求更快的方法。

有一个只有两列的DataFrame。

export default class App extends Component {

 render() {
  return (
   <View style={styles.view}>
    <FlatList
      data={['1', '2', '3', '4', '5', '6', '7', '8']}
      numColumns={4}
      renderItem={({ item }) => (
        <View style={styles.separator}>
          <Text style={styles.text}>{item}</Text>
        </View>
      )}
    />
   </View>
  );
 }
}

const styles = StyleSheet.create({
 view: {
  paddingTop: 30,
 },
 text: {
  flex: 1,
  fontSize: 40,
  textAlign: 'center'
 },
 separator: {
  flex: 1, 
  borderWidth: 1, 
  borderColor: 'red'
 },
});

现在,这是我的问题。我想获得具有两列最常见值的id。我目前的解决方案就在下面:

     In[1]: import pandas as pd

     In[2]: temp = pd.DataFrame({'id':['a','a','a','b','b','b'],'col1':[1,2,3,1,2,5],'col2':[1,2,4,1,3,4]}).set_index('id')

     In[3]: temp

     Out[3]:
          col1   col2
    id       
    a        1      1
    a        2      2
    a        3      4
    b        1      1
    b        2      3
    b        5      4

我的小例子的答案是&#39; a&#39;

     In[4]: def count_num(table_name): return (sum(table_name.col1==table_name.col2))

     In[5]: best_value, best_ans = [0], [0]

     In[6]: for m in np.unique(temp.index):
      ...:     temp_ans = count_num(temp.loc[m])
      ...:     if temp_ans > best_value[0]:
      ...:         best_value.append(temp_ans)
      ...:         best_ans.append(m)
      ...:         best_value = best_value[1:]
      ...:         best_ans = best_ans[1:]

正如你所知,我使用for循环一次运行一个索引的函数,如果有很多不同的索引,那将是浪费时间。

我希望不使用for循环就可以做同样的事情。

谢谢你的帮助!!!

2 个答案:

答案 0 :(得分:0)

使用groupby

In [1310]: temp.eq(temp.col1, axis='index').all(axis=1).groupby('id').sum().idxmax()
Out[1310]: 'a'

可替换地,

In [1313]: temp.apply(pd.Series.nunique, axis=1).eq(1).groupby('id').sum().idxmax()
Out[1313]: 'a'

如果您只有两列可以

,则上述两种解决方案适用于多列
In [1329]: temp.col1.eq(temp.col2).groupby('id').sum().idxmax()
Out[1329]: 'a'

详细说明:

In [1315]: temp.eq(temp.col1, axis='index')
Out[1315]:
    col1   col2
id
a   True   True
a   True   True
a   True  False
b   True   True
b   True  False
b   True  False

In [1316]: temp.apply(pd.Series.nunique, axis=1)
Out[1316]:
id
a    1
a    1
a    2
b    1
b    2
b    2
dtype: int64

答案 1 :(得分:0)

您可以先比较列,然后将<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <script> $(document).ready(function() { $('button').click(function() { console.log('work'); }); }); </script> <button>click</button>值与groupbysum相加,然后按idxmax得到最大值索引:

True

与...相同:

print ((temp.col1==temp.col2))
id
a     True
a     True
a    False
b     True
b    False
b    False
dtype: bool

print ((temp.col1==temp.col2).groupby(level='id').sum())

id
a    2.0
b    1.0
dtype: float64

print ((temp.col1==temp.col2).groupby(level='id').sum().idxmax())
a