相关文章推荐
狂野的麦片  ·  基于 TMDB ...·  1 周前    · 
有胆有识的椰子  ·  Pandas ...·  1 周前    · 
兴奋的草稿纸  ·  如何从spark scala ...·  3 天前    · 
月球上的啄木鸟  ·  java - Spring ...·  1 年前    · 
会开车的滑板  ·  WPF ...·  1 年前    · 

等等...

1 个评论
BENY
what is the input data ?>
python
pandas
dataframe
Mustard Tiger
Mustard Tiger
发布于 2018-08-22
3 个回答
BENY
BENY
发布于 2021-03-22
0 人赞同

IIUC,你需要首先将单个dict转换为数据框架,然后我们做 append ,如果我们没有重复的 'id' ,我们需要 groupby 获得 first 的值。

df=pd.DataFrame()
l=[{'id':234,'2018-01':2},
{'id':534,'2018-01':5},
{'id':534,'2018-03':4}]
for x in l:
    df=df.append(pd.Series(x).to_frame().T.set_index('id')).groupby(level=0).first()
    print(df)
     2018-01
234        2
     2018-01
234        2
534        5
     2018-01  2018-03
234      2.0      NaN
534      5.0      4.0
    
okartal
okartal
发布于 2021-03-22
0 人赞同

在每次迭代时生成一个新的数据帧并进行追加是不可取的,这相当昂贵。如果你的数据不是太大,适合内存,你可以先做一个字典的列表,然后pandas允许你简单地做。

df = pd.DataFrame(your_list_of_dicts)
df.set_index('id')

如果制作一个列表的成本太高(因为你想为数据框架节省内存),可以考虑使用一个发电机 instead of a list. The basic anatomy of a 发电机 function is this:

def datagen(your_input):
    for item in your_input:
        # your code to make a dict
        yield dict

The 发电机 object data = datagen(input) will not store the dicts but yields a dict at each iteration. It can generate items on demand. When you do pd.DataFrame(data), pandas will stream all the data and make a data frame. Generators can be used for data pipelines (like pipes in UNIX) and are very powerful for big data workflows. Be aware, however, that a 发电机 object can be consumed only once, that is if you run pd.DataFrame(data) again, you will get an empty data frame.

你能给出更多信息,为什么在一个循环中向现有的DF添加数据是 "昂贵的"? 正如你提到的,对于 memory 就地添加行会更节省内存;如果能知道时间效率如何,那就更好了。 我知道每次迭代的时间对于数以百万计的行来说可能是个问题,但对于1000行来说,这也许不是个问题。
Demis
Demis
发布于 2021-03-22
0 人赞同

在Pandas中,我发现最简单的方法(虽然不直观)是用 df.loc[ ] 来引用最后一条(不存在的)记录,用 len(df) 作为索引,来迭代追加新的数据行到一个数据框架中。

df.loc[ len(df) ] = [new, row, of, data]

这将把新的数据行 "附加 "到数据框架的末尾。

上面的例子是针对一个正好有4列的空数据框架,如:。

df = pandas.DataFrame(  columns=["col1", "col2", "col3", "col4"]  )

df.loc[ ]索引可以在任何行插入数据,无论它是否存在。 似乎它永远不会给出一个IndexError,就像一个numpy.array or List如果你试图分配给一个不存在的行,就会这样。 对于一个全新的、空的DataFrame,len(df)返回0,从而引用第一条空白行,然后每增加一行就增加一条。

–––––

我不知道这种方法的速度/内存效率成本,但它对我的适度数据集(几千行)非常有效。 至少从内存的角度来看,我认为一个大的循环直接将数据追加到目标DataFrame中,会比先生成一个中间的重复数据列表,然后从该列表中生成一个DataFrame使用更少的内存。 时间 "效率 "可能是一个完全不同的问题,需要其他SO大师们来评论。

–––––

然而,对于OP的具体案例,你还有如果数据是用于现有的相同名称的列,你需要在你的for循环中使用某个逻辑来合并columns

相反,我会让DataFrame "哑巴",只是按原样导入数据,重复他们的日期,例如,你的后循环DataFrame看起来像这样,用简单的列名描述未生的日期。

id date data 234 2018-01 2