【问题标题】:Pandas dataframe, empty or with 3 column to picklePandas 数据框,空的或带有 3 列来腌制
【发布时间】:2018-04-09 12:03:46
【问题描述】:

我根本不习惯 pandas,所以我的问题有几个问题。

我有一个函数计算一个名为solutions 的列表。此列表可以由 3 个值的元组组成 (a, b, c) 或为空。

solutions = [(a,b,c), (d,e,f), (g,h,i)]

为了保存,我先把它变成一个numpy数组,然后在命名列后用pandas保存。

solutions = np.asarray(solutions)
df = pd.DataFrame(solutions)
df.columns = ["Name1", "Name2", "Name3"]
df.to_pickle(path)

我的问题是我有时有一个空的解决方案列表:solutions = []。因此,df.columns 行会引发错误。为了绕过它,我目前检查解决方案的大小,如果它是空的,我会这样做:

pickle.dump([], path, "wb")

我希望我的数据类型之间更加一致,并在两种方案之间保存相同的格式。 => 如果列表为空,我想用空数据框保存 3 列名称。最终目标是使用pd.read_pickle() 重新打开文件并轻松访问其中的数据。

第二个问题,我想重新打开腌制的文件,并添加一列。你能告诉我这样做的正确方法吗?

第三个问题,如何选择数据框的一部分。例如,我想要 Name1 value % 0.25 == 0 列所在的所有行。

谢谢

【问题讨论】:

  • 您能否提供实际将列表solutions 插入DataFrame df 的代码?
  • @PeterLeimbigler 是的,编辑完成,我在示例中遗漏了一行,抱歉。

标签: python pandas pickle


【解决方案1】:

使用以下方法创建数据框:

df = pandas.DataFrame(data=solutions, columns=['name1', 'name2', 'name3'])

如果solutions 为空,它仍然会创建一个具有 3 列和 0 行的数据框。

In [2]: pd.DataFrame(data=[(1,2,3), (4,5,6)], columns=['a','b','c'])
Out[2]: 
   a  b  c
0  1  2  3
1  4  5  6
In [3]: pd.DataFrame(data=[], columns=['a','b','c'])
Out[3]: 
Empty DataFrame
Columns: [a, b, c]
Index: []

【讨论】:

  • 正是我所需要的。谢谢。
  • 不要使用np.asarray(),看我的编辑(cmets不容易用代码格式化;-)
  • 是的,我注意到了,这就是我删除评论的原因......这对我来说还不是直截了当的想法。谢谢。
  • 但是有没有办法以同样的方式重新加载数据。现在我正在做df = pd.read_pickle(path).values,它返回 np.arrays 的 np.arrays ......而且当我写的时候有元组列表,当我读的时候有数组的数组是很烦人的:/
  • Pandas 有一系列方便的助手来使用各种文件格式加载/保存。我通常依赖 csv,因为使用文本编辑器很容易阅读它们。出于兼容性和安全原因,我会避免使用 to_pickle 和 read_pickle(有关更多信息,请参阅 docs.python.org/3.6/library/pickle.htmlpandas.pydata.org/pandas-docs/stable/io.html#io-pickle)。如果您的问题与此无关,请在 SO 上打开一个新问题,因为 cmets 不太方便讨论它;)
【解决方案2】:

第三个问题:

df["Name1"] % 0.25 == 0

计算一系列为真的布尔值,其中第一列中的值可以除以 0.25。您可以使用它来选择数据框的行:

df[ df["Name1"] % 0.25 == 0 ]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-03
    • 2018-02-23
    • 2015-12-05
    • 1970-01-01
    • 2014-11-18
    • 1970-01-01
    • 2017-05-02
    相关资源
    最近更新 更多