将pandas DataFrame从宽范围转换为长范围,并统计唯一值的出现次数

时间:2018-12-15 05:09:01

标签: python pandas dataframe format transform

您好,亲爱的社区,我有一个非常具体的问题,可惜我无法解决。目前我要转换的DataFrame看起来像这样。

                JSONArray ja = new JSONArray(data);

                for (int i = 0; i < ja.length(); i++) {
                    JSONObject jo = (JSONObject) ja.get(i);

                    singleParsed = "\n" + "\n" + "NAME : " + jo.get("name") + "\n" +
                            "PASSWORD : " + jo.get("password") + "\n" +
                            "CONTACT : " + jo.get("contact") + "\n" +
                            "COUNTRY : " + jo.get("country") + "\n";

                    dataParsed = dataParsed + singleParsed + "\n";
                }

            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (JSONException e) {
                e.printStackTrace();
            }
            try {
                return ParseMoviesJsonString(dataParsed);
            } catch (JSONException e) {
                e.printStackTrace();
            }
            return null;
        }




        private ArrayList<User> ParseMoviesJsonString(String dataParsed) throws JSONException {

            final String json_name = "name";
            final String json_password = "password";
            final String json_contact = "contact";
            final String json_country = "country";

            ArrayList<User> list = new ArrayList<>();

            JSONObject MovieJson = new JSONObject(dataParsed);//MovieJson got the data and then skipps the followinglines and directly go to onPostExecute
            JSONArray MovieArray = MovieJson.getJSONArray(dataParsed);

            for (int i = 0; i < MovieArray.length(); i++) {

                JSONObject result_movie = MovieArray.getJSONObject(i);
                User movie = new User();
                movie.setU_name(result_movie.getString(json_name));
                movie.setU_password(result_movie.getString(json_password));
                movie.setU_contact(result_movie.getString(json_contact));
                movie.setU_country(result_movie.getString(json_country));

                list.add(movie);
            }
            return list;
        }

        @Override
        protected void onPostExecute(ArrayList<User> list) {// list : null
            super.onPostExecute(list);

            adapter.updateList(list);
            adapter.notifyDataSetChanged();
        }
    }
}

转换后,它应该看起来像这样。

df_larceny
CATEGORY    INCIDENTYEAR    INCIDENTMONTH       
LARCENY     2009            1
LARCENY     2009            1
LARCENY     2009            1
.............................
.............................
LARCENY     2016           11
LARCENY     2016           12
LARCENY     2016           12
LARCENY     2016           12

基本上,我想计算每年每个月发生盗窃的频率。

我以前尝试过this tutorial,可惜没有运气。

我也使用value_counts()尝试了各种方法,但不幸的是没有运气。

出于最后的绝望,我手动为另一个看起来像这样的DataFrame做了

COUNT   INCIDENTYEAR    INCIDENTMONTH       
234     2009            1
453     2009            2
847     2009            3
943     2009            4
958     2009            5
.............................
.............................
324     2016           11
372     2016           12
241     2016           12
412     2016           12

我每个月都要这样做,并在最后创建了一个新的DataFrame,即使对于像我这样的业余爱好者来说,效率也太低了。 我希望任何人都可以在这里帮助我。

1 个答案:

答案 0 :(得分:2)

也许是这样的:

df_larceny[df_larceny['CATEGORY'] == 'LARCENY'].groupby(['INCIDENTYEAR', 'INCIDENTMONTH']).count().reset_index()