微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python – Pandas:按列中的观察数量扩展DataFrame

Stata具有函数expand,其将行添加到对应于特定列中的值的数据库.例如:

我有

df = pd.DataFrame({"A":[1, 2, 3], 
                   "B":[3,4,5]})

   A  B
0  1  3
1  2  4
2  3  5

我需要的:

df2 = pd.DataFrame({"A":[1, 2, 3, 2, 3, 3], 
                    "B":[3,4,5, 4, 5, 5]})

   A  B
0  1  3
1  2  4
2  3  5
3  2  4
4  3  5
6  3  5

df.loc [0,’A’]中的值为1,因此没有额外的行添加到DataFrame的末尾,因为B = 3只应该发生一次.

df.loc [1,’A’]中的值为2,因此在DataFrame的末尾添加一个观察值,使B = 4的总出现次数为2.

df.loc [2,’A’]中的值为3,因此将两个观察值添加到DataFrame的末尾,使得B = 5的总出现次数为3.

为了让我开始,我已经仔细研究了以前的问题,但没有运气.任何帮助表示赞赏.

解决方法:

有许多可能性,都建于np.repeat左右:

def using_reindex(df):
    return df.reindex(np.repeat(df.index, df['A'])).reset_index(drop=True)

def using_dictcomp(df):
    return  pd.DataFrame({col:np.repeat(df[col].values, df['A'], axis=0) 
                          for col in df})

def using_df_values(df):
    return pd.DataFrame(np.repeat(df.values, df['A'], axis=0), columns=df.columns)

def using_loc(df):
    return df.loc[np.repeat(df.index.values, df['A'])].reset_index(drop=True)

例如,

In [219]: df = pd.DataFrame({"A":[1, 2, 3], "B":[3,4,5]})
In [220]: df.reindex(np.repeat(df.index, df['A'])).reset_index(drop=True)
Out[220]: 
   A  B
0  1  3
1  2  4
2  2  4
3  3  5
4  3  5
5  3  5

这是1000行的基准测试
数据帧;结果是一个大约500K行的DataFrame:

In [208]: df = make_dataframe(1000)

In [210]: %timeit using_dictcomp(df)
10 loops, best of 3: 23.6 ms per loop

In [218]: %timeit using_reindex(df)
10 loops, best of 3: 35.8 ms per loop

In [211]: %timeit using_df_values(df)
10 loops, best of 3: 31.3 ms per loop

In [212]: %timeit using_loc(df)
1 loop, best of 3: 275 ms per loop

这是我用来生成df的代码

import numpy as np
import pandas as pd

def make_dataframe(nrows=100):
    df = pd.DataFrame(
        {'A': np.arange(nrows),
         'float': np.random.randn(nrows),
         'str': np.random.choice('Lorem ipsum dolor sit'.split(), size=nrows),
         'datetime64': pd.date_range('20000101', periods=nrows)},
        index=pd.date_range('20000101', periods=nrows))
    return df

df = make_dataframe(1000)

如果只有几列,则using_dictcomp是最快的.但请注意,using_dictcomp假设df具有唯一的列名. using_dictcomp中的字典理解不会重复重复的列名.但是,其他替代方法将使用重复的列名称.

using_reindex和using_loc都假定df具有唯一索引.

using_reindex来自cᴏʟᴅsᴘᴇᴇᴅ的using_loc,现在(不幸的是)
删除帖子. cᴏʟᴅsᴘᴇᴇᴅ表明没有必要手动重复所有值 – 你只需要重复索引然后让df.loc(或df.reindex)为你重复所有行.它还避免访问df.values,如果df包含多个dtypes的列,则df.values可以生成对象dtype的中间NumPy数组.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐