首页 文章

通过复制行摆脱“计数”列

提问于
浏览
1

我有一个像这样的pandas DataFrame

string count values
----
string1 3 vals1
string2 2 vals2

我希望通过重复每一行“count”次来摆脱“count”列,以获得像这样的DataFrame

string1 vals1
string1 vals1
string1 vals1
string2 vals2
string2 vals2

这个操作有一个简单的熊猫配方吗?

3 回答

  • 1

    尝试:

    df.groupby(['string','values']) . apply(lambda x:pd.concat([x] * sum(x ['count']))) . reset_index(drop = True)

    假设您想要多个计数行的总和 .

  • 1

    不确定是否有更好的本地方式,但你可以做类似的事情

    >>> df.iloc[np.repeat(np.arange(len(df)), df["count"])]
        string  count values
    0  string1      3  vals1
    0  string1      3  vals1
    0  string1      3  vals1
    1  string2      2  vals2
    1  string2      2  vals2
    

    得到一些东西,然后删除计数和(如果你想) reset_index(drop=True) .

  • 1

    我不相信有任何简单的方法可以做到这一点(如在函数中) . 这是一个解决方法,它创建一个嵌套列表,然后用于重新创建扩展数据帧 .

    # Sample data.
    df = pd.DataFrame({'string': ['string1', 'string2'], 'count': [3, 2], 'values': ['vals1', 'vals2']})
    >>> df
       count   string values
    0      3  string1  vals1
    1      2  string2  vals2
    
    # Use nested list comprehension to repeat selected columns of each row `count` times.
    df2 = pd.DataFrame([[row['string'], row['values']]
                         for _, row in df.iterrows() 
                         for _ in range(row['count'])],
                       columns=['string', 'values'])
    
    >>> df2
        string values
    0  string1  vals1
    1  string1  vals1
    2  string1  vals1
    3  string2  vals2
    4  string2  vals2
    

相关问题