如何将系列中的pandas DataFrame中的行转换回DataFrame?

时间:2014-04-30 00:19:31

标签: python pandas

我正在遍历pandas DataFrame的行,将每一行扩展为N行,并在每行中添加其他信息(为简单起见,我在此处将其作为随机数):< / p>

from pandas import DataFrame
import pandas as pd
from numpy import random, arange

N=3
x = DataFrame.from_dict({'farm' : ['A','B','A','B'], 
                         'fruit':['apple','apple','pear','pear']})
out = DataFrame()
for i,row in x.iterrows():
    rows = pd.concat([row]*N).reset_index(drop=True)  # requires row to be a DataFrame
    out = out.append(rows.join(DataFrame({'iter': arange(N), 'value': random.uniform(size=N)})))

在此循环中,rowSeries对象,因此对pd.concat的调用不起作用。如何将其转换为DataFrame? (例如x.ix[0:0]x.ix[0]之间的差异)

谢谢!

1 个答案:

答案 0 :(得分:1)

根据你评论的内容,我会尝试

def giveMeSomeRows(group):
    return random.uniform(low=group.low, high=group.high, size=N)

results = x.groupby(['farm', 'fruit']).apply(giveMeSomeRows)

这应该为您提供单独的结果数据框。我假设每个农场 - 水果组合都是​​独一无二的......如果我们对您的数据有更多了解,可能还有其他方法。

更新

运行代码示例

def giveMeSomeRows(group):
    return random.uniform(low=group.low, high=group.high, size=N)

N = 3
df = pd.DataFrame(arange(0,8).reshape(4,2), columns=['low', 'high'])
df['farm'] = 'a'
df['fruit'] = arange(0,4)
results = df.groupby(['farm', 'fruit']).apply(giveMeSomeRows)

DF

   low  high farm  fruit
0    0     1    a      0
1    2     3    a      1
2    4     5    a      2
3    6     7    a      3

结果

farm  fruit
a     0        [0.176124290969, 0.459726835079, 0.999564934689]
      1           [2.42920143009, 2.37484506501, 2.41474002256]
      2           [4.78918572452, 4.25916442343, 4.77440617104]
      3           [6.53831891152, 6.23242754976, 6.75141668088]

如果您想要一个数据帧,可以将该功能更新为

def giveMeSomeRows(group):
    return pandas.DataFrame(random.uniform(low=group.low, high=group.high, size=N))

结果

                     0
farm fruit            
a    0     0  0.281088
           1  0.020348
           2  0.986269
     1     0  2.642676
           1  2.194996
           2  2.650600
     2     0  4.545718
           1  4.486054
           2  4.027336
     3     0  6.550892
           1  6.363941
           2  6.702316