【问题标题】:Create a Dataframe from a Series and a String从系列和字符串创建数据框
【发布时间】:2018-05-27 16:05:56
【问题描述】:

假设我有一个数据框,其中的列包含字符串、系列和整数,我想将其组合成一个新的数据框,其中字符串和整数与系列中的每个条目相结合。我该怎么办?

举个例子:

data = {'fruits': ['banana', 'apple', 'pear'], 
    'source' : (['brazil', 'algeria', 'nigera'], ['brazil', 'morocco', 'iran', 'france'], ['china', 'india', 'mexico']),
    'prices' : [2, 3, 7]}
df = pd.DataFrame(data, columns = ['fruits', 'source', 'prices'])

我想获得一个 3x10 的数据框;

['banana', 'banana', 'banana', 'apple', 'apple', 'apple', 'apple', 'pear', 'pear', 'pear'],
['brazil', 'algeria', 'nigera', 'brazil', 'morocco', 'iran', 'france', 'china', 'india', 'mexico'],
['2', '2', '2', '3', '3', '3', '3', '7', '7', '7'],

我想它不应该太复杂,但我找不到一个简洁的解决方案。

【问题讨论】:

标签: python string pandas


【解决方案1】:

通过使用stackapply(pd.Series)

df.set_index(['fruits','prices']).source.apply(pd.Series).\
      stack().reset_index(level=['fruits','prices']).\
             rename(columns={0:'source'})
Out[64]: 
   fruits  prices   source
0  banana       2   brazil
1  banana       2  algeria
2  banana       2   nigera
0   apple       3   brazil
1   apple       3  morocco
2   apple       3     iran
3   apple       3   france
0    pear       7    china
1    pear       7    india
2    pear       7   mexico

Op2 重新创建你的 df

df1=df[['fruits','prices']].reindex(df.index.repeat(df.source.apply(len)))
df1['source']=np.concatenate(df.source.values)
df1
Out[69]: 
   fruits  prices   source
0  banana       2   brazil
0  banana       2  algeria
0  banana       2   nigera
1   apple       3   brazil
1   apple       3  morocco
1   apple       3     iran
1   apple       3   france
2    pear       7    china
2    pear       7    india
2    pear       7   mexico

【讨论】:

    【解决方案2】:

    使用explode()函数:

    In [30]: explode(df, lst_cols='source')
    Out[30]:
       fruits   source  prices
    0  banana   brazil       2
    1  banana  algeria       2
    2  banana   nigera       2
    3   apple   brazil       3
    4   apple  morocco       3
    5   apple     iran       3
    6   apple   france       3
    7    pear    china       7
    8    pear    india       7
    9    pear   mexico       7
    

    【讨论】:

    • 这很好 :-) 就像 R 中的 unnest 一样,希望 pandas 可以考虑将其添加到他们的模块中
    • 能够回顾旧答案并重用代码真是太好了。
    • 谢谢你们! :-)
    • 这些 pandas func 名称听起来像一些 pyscho 电影动作 - 爆炸、融化、剪切;)
    • @Divakar chuckle 只需要更多类似的东西 - 领带、手铐、挤压……等 numpy 中已经存在一个。 ;)
    【解决方案3】:

    我使用concat + melt 对此进行了尝试。

    c = ['fruits', 'prices']
    df =  (pd.concat([pd.DataFrame(df.source.tolist()), df[c]], 1)
             .melt(c, value_name='source')
             .drop('variable', 1)
             .dropna())
    
    df
    
        fruits  prices   source
    0   banana       2   brazil
    1    apple       3   brazil
    2     pear       7    china
    3   banana       2  algeria
    4    apple       3  morocco
    5     pear       7    india
    6   banana       2   nigera
    7    apple       3     iran
    8     pear       7   mexico
    10   apple       3   france
    

    【讨论】:

      猜你喜欢
      • 2016-10-14
      • 2021-08-18
      • 2018-11-03
      • 1970-01-01
      • 2018-02-26
      • 1970-01-01
      • 1970-01-01
      • 2019-02-12
      • 2021-12-24
      相关资源
      最近更新 更多