【问题标题】:Pandas: Storing a DataFrame object inside another DataFrame i.e. nested DataFramePandas:将 DataFrame 对象存储在另一个 DataFrame 中,即嵌套 DataFrame
【发布时间】:2018-05-13 21:17:57
【问题描述】:

我想将DataFrame 对象存储为行列的值: 这是我想要达到的目标的简化类比。

>>> df = pd.DataFrame([[1,2,3],[2,4,6]], columns=list('DEF'))
>>> df    
166:    D  E  F
     0  1  2  3
     1  2  4  6

我创建了一个新的 DataFrame,并在插入新的 DataFrame 对象作为新列的值时添加了一个新列。请参考代码。

>>> df_in_df = pd.DataFrame([[11,13,17],[19, 23, 31]], columns=list('XYZ'))
>>> df.loc[df['F'] == 6, 'G'] = df_in_df
>>> df
   D  E  F   G
0  1  2  3 NaN
1  2  4  6 NaN
>>> df.loc[df['F'] == 6, 'G'].item()
    nan
>>> # But the below works fine, i.e. when I insert an integer
>>> df.loc[df['F'] == 6, 'G'] = 4
>>> df
>>>   D  E  F    G
   0  1  2  3  NaN
   1  2  4  6  4.0
>>> # and to verify 
>>> df.loc[df['F'] == 6, 'G'].item()
    4.0

顺便说一句,我已经设法通过将 DataFrame 酸洗成一个字符串来解决这个问题,但我对此感觉不好:

df.loc[df['F'] == 6, 'G'] = pickle.dumps(df_in_df)
>>> df
187:    D  E  F                                                  G
     0  1  2  3                                                NaN
     1  2  4  6  ccopy_reg\n_reconstructor\np0\n(cpandas.core.f...

>>> revive_df_from_df = pickle.loads(df.loc[df['F'] == 6, 'G'].item())
>>> revive_df_from_df
191:     X   Y   Z
     0  11  13  17
     1  19  23  31

在 10 分钟内通过 pandas 参考后,我今天开始使用 pandas,所以我不知道约定,有更好的想法吗? 谢谢!

【问题讨论】:

  • 很难理解你要达到什么目标——你在说panels吗?
  • 我想在特定行的列中插入一个 DataFrame 对象。
  • 您为什么要这样做? Pandas 应该是一个快速的表查询框架。

标签: python pandas dataframe


【解决方案1】:

依靠这种行为,你的处境很不稳定。当将类似数组的东西传递给它的构造函数和赋值函数时,pandas 做了很多工作来推断你的意思或想要的东西。这似乎是故意的。

似乎通过loc 直接分配不起作用。这是我发现的解决方法。同样,我期望这种行为比 pandas 版本更强大。

df = pd.DataFrame([[1,2,3],[2,4,6]], columns=list('DEF'))

df_in_df = pd.DataFrame([[11,13,17],[19, 23, 31]], columns=list('XYZ'))

df.loc[df['F'] == 6, 'G'] = np.nan
df.loc[df['F'] == 6, 'G'] = df.loc[df['F'] == 6, ['G']].applymap(lambda x: df_in_df)

df

【讨论】:

  • 为什么,按照惯例将 DF 插入另一个 DF 是不是有点错误?
  • 因为在名为 Numpy 的 init pandas 上创建了数组..现在它的获取序列。 @wolframalpha .. 你的用例不是 pandas 的设计目的。
  • 我不是这个问题的权威。但我会说是的。没有错。但是按照惯例是错误的(我猜这是什么意思)。 pandas 提供的优势有多种形式,包括它的推理。将一般对象放在数据框中应该不是问题。期望此代码在未来版本中继续运行。我猜开发人员很可能会改变它的工作方式,以试图更好地推断人们在尝试这样的事情时可能意味着什么。使用 MultiIndex 可以更好地处理将高维结构放置在高维结构中。
  • @piRSquared 好的,这很好,但是将单行映射到另一个 DF 的多行不是很酷(就像在我们使用联结表的数据库中一样),我从那以后下次问你这个我不会在 pandas 上使用这个东西!
【解决方案2】:

先创建一个字典:

x = pd.DataFrame()

y =  {'a':[5,4,5],'b':[6,9,7], 'c':[7,3,x]}

# {'a': [5, 4, 5], 'b': [6, 9, 7], 'c': [7, 3, Empty DataFrame
#   Columns: []
#   Index: []]}

z = pd.DataFrame(y)

#   a  b                                      c
# 0  5  6                                      7
# 1  4  9                                      3
# 2  5  7  Empty DataFrame
# Columns: []
# Index: []
# In [ ]:

(或者,将DataFrame转成dict,尝试插入。有很多 发生,当熊猫创建对象时..你在折磨熊猫。您的用例意味着嵌套的字典,我会使用它。 )

【讨论】:

  • 是的,对,谢谢,但我想创建一个新列,然后在行中插入一个 DataFrame!有什么想法吗?
  • 是的,确实会更好!
  • 您是否打算通过 pandas 方法访问插入的 DF。它可能行不通。使用链表——或 dict 和 pandas 或仅使用 Sqlite——以这种方式折磨 pandas 将导致未来的重写
  • 这不会发生!使用字典!
【解决方案3】:

首先创建要插入字典的列。 然后使用 repr 函数将您的字典转换为字符串。 然后将字符串字典插入您的列。 如果要查询该字符串。先选中它,然后再用eval(dict)转成字典再使用。

【讨论】:

    猜你喜欢
    • 2013-06-05
    • 1970-01-01
    • 1970-01-01
    • 2014-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-01
    • 2019-07-03
    相关资源
    最近更新 更多