结合融化和groupby在熊猫df上

时间:2020-09-14 22:14:33

标签: python python-3.x pandas pandas-groupby melt

我有一个看起来像这样的df

country       country_abbr region year v1       v2      v3      ... v100
India         IN            IND   1999 327.0    7058.0  8856.0  ... 7900.0
Saint Lucia   LC            LCA   1990 NaN      NaN     NaN     ... NaN
Samoa         WS            WSM   1985 NaN      NaN     NaN     ... NaN
Somalia       SO            SOM   1999 136.0    643.0   678.0   ... 175.0

我正在寻找一种简单的方法将所有vi变量折叠为一个变量v(将表从宽变长),然后创建一个新列来保存值vicountryv的数量。

我尝试过这样的事情:

col_vals = df.columns.difference(['country', 'country_abbr', 'region', 'year'])
df2 = melt(df, col_vals, 'v', 'count')
df2['count'].astype(int)

但是我注意到很多数据丢失了,我不确定为什么。

编辑以添加预期的输出:

country     year    v   count
India       1999    v1  327.0
India       1999    v2  7058.0
India       1999    v3  8856.0
Somalia     1999    v1  136.0
Somalia     1999    v2  643.0
Somalia     1999    v3  678.0

2 个答案:

答案 0 :(得分:0)

pd.wide_to_long(df, ["v"], i = ["country", "country_abbr", "region", "year"], j ="V").rename(columns = {'v':'Count'})

我认为这就是您的意思,但我不确定100%,请让我知道您的“计数”列是否意味着您。

答案 1 :(得分:0)

这是您的主意吗?

(df.melt(["country", "country_abbr", "region", "year"], 
         var_name="v")
 .dropna()
 .sort_values("country"))

    country country_abbr    region  year    v       value
0   India   IN               IND    1999    v1      327.0
4   India   IN               IND    1999    v2      7058.0
8   India   IN               IND    1999    v3      8856.0
12  India   IN               IND    1999    v100    7900.0
3   Somalia SO               SOM    1999    v1      136.0
7   Somalia SO               SOM    1999    v2      643.0
11  Somalia SO               SOM    1999    v3      678.0
15  Somalia SO               SOM    1999    v100    175.0