【问题标题】:Why is pandas df not what was expected? [duplicate]为什么 pandas df 不是预期的? [复制]
【发布时间】:2020-09-08 11:26:00
【问题描述】:

我编写了以下简单代码来说明我遇到的问题:

import pandas as pd

symbols = {'TEST1', 'TEST2', 'TEST3'}

i = 0

for sym in symbols:
    if i == 0:
        cum_df = pd.DataFrame([sym])
        i = 1
    else:
        cum_df.append(pd.DataFrame([sym]), ignore_index=True)

cum_df

我期待cum_df 看起来像这样:

+---+-------+
|   |   0   |
+---+-------+
| 0 | TEST1 |
| 1 | TEST2 |
| 2 | TEST3 |
+---+-------+

但它看起来像这样:

+---+-------+
|   |   0   |
+---+-------+
| 0 | TEST3 |
+---+-------+

我哪里错了?

【问题讨论】:

  • 在数据帧上追加的方法不像列表那样工作,您需要重新分配它,因此在您的其他情况下,尝试使用cum_df = cum_df.append(pd.DataFrame([sym]), ignore_index=True),但构建数据帧不是一个好习惯方式
  • 谢谢 - 这工作但它似乎需要一段时间(相对于一个简单的循环),然后在 TEST2、TEST3、TEST1 中输出 df。任何想法为什么?从循环构建数据框的更好方法是什么?实际上,我是从数据库中提取symbols,然后在循环中使用它们,我在数据库中查询数据,然后从中提取并构建组合数据框。
  • 最佳实践是将您查询的数据框附加到l = []for sym in symbols: l.append(pd.DataFrame([sym])) 之类的列表中,然后在循环之外执行cum_df = pd.concat(l)(如果您可以在列表理解中执行) ,用concat方法检查这个link的最后一个例子
  • 是的 - 那个链接很棒!谢谢

标签: python pandas dataframe jupyter-notebook


【解决方案1】:

这样做:

In [1504]: symbols = {'TEST1', 'TEST2', 'TEST3'}
In [1506]: df = pd.DataFrame(symbols)           

In [1507]: df 
Out[1507]: 
       0
0  TEST1
1  TEST3
2  TEST2

如果你想分配列名,你可以这样做:

In [1509]: df = pd.DataFrame(symbols, columns=['Col1'])
In [1510]: df                                          
Out[1510]: 
    Col1
0  TEST1
1  TEST3
2  TEST2

【讨论】:

  • 谢谢,但我并不是在寻找实现结果的捷径——我正在处理的实际代码更复杂,涉及从数据库中的多个来源提取数据。请参阅上面我对@Ben.T 的评论
猜你喜欢
  • 2017-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-08
  • 1970-01-01
  • 2014-02-18
  • 1970-01-01
  • 2016-09-22
相关资源
最近更新 更多