Python 数据帧应该嵌套吗?

Python 数据帧应该嵌套吗?,python,pandas,Python,Pandas,我正在创建一个python脚本,它驱动一个旧的fortran代码来定位地震。我想在python脚本中改变fortran代码的输入参数,并在数据帧中记录结果以及产生结果的值。每次运行的结果也可以方便地放入一个数据帧中,这样我就有了一个嵌套的数据帧(即分配给数据帧元素的数据帧)。例如: import pandas as pd import numpy as np def some_operation(row): results = np.random.rand(50, 3) * row['

我正在创建一个python脚本,它驱动一个旧的fortran代码来定位地震。我想在python脚本中改变fortran代码的输入参数,并在数据帧中记录结果以及产生结果的值。每次运行的结果也可以方便地放入一个数据帧中,这样我就有了一个嵌套的数据帧(即分配给数据帧元素的数据帧)。例如:

import pandas as pd
import numpy as np

def some_operation(row):
    results = np.random.rand(50, 3) * row['p1'] / row['p2']
    res = pd.DataFrame(results, columns=['foo', 'bar', 'rms'])
    return res

# Init master df
df_master = pd.DataFrame(columns=['p1', 'p2', 'results'], index=range(3))
df_master['p1'] = np.random.rand(len(df_master))
df_master['p2'] = np.random.rand(len(df_master))
df_master = df_master.astype(object) # make sure generic types can be used
# loop over each row, call some_operation and store results DataFrame
for ind, row in df_master.iterrows():
    df_master.loc[ind, "results"] = some_operation(row)
>>> df1 = pd.DataFrame({'a':[1, 2, 3], 'b':[4, 5, 6]})
>>> df2 = pd.DataFrame({'a':[100], 'b':[200]})
>>> df1.loc[[0], ['a', 'b']] = df2
>>> df1
     a    b
0  100  200
1    2    5
2    3    6
这引发了这一例外:

ValueError:索引器与DataFrame不兼容

但是,如果我将最后一行更改为:

df_master["results"][ind] = some_operation(row) 
我有几个问题:

  • 当切片分配成功时,为什么.loc(和.ix)失败?如果some_操作函数返回一个列表、字典等,它似乎工作正常

  • 数据帧应该以这种方式使用吗?我知道dtype对象在排序等方面可能非常慢,但我实际上只是使用dataframe作为一个方便的容器,因为列/索引表示法非常灵活。如果数据帧不应以这种方式使用,是否有类似的替代方案?我正在查看Panel类,但我不确定它是否适合我的应用程序。我不喜欢继续前进,将上面显示的黑客应用于某些代码,然后在未来的熊猫版本中不支持它

  • 切片分配成功时,
    .loc
    (和
    .ix
    )为什么会失败?如果some_操作函数返回一个列表、字典等,它似乎可以正常工作
  • 这是代码的一个奇怪的小角落。它源于这样一个事实,即如果要分配的项是一个数据帧,
    loc
    ix
    假设您希望用数据帧的内容填充给定的索引。例如:

    import pandas as pd
    import numpy as np
    
    def some_operation(row):
        results = np.random.rand(50, 3) * row['p1'] / row['p2']
        res = pd.DataFrame(results, columns=['foo', 'bar', 'rms'])
        return res
    
    # Init master df
    df_master = pd.DataFrame(columns=['p1', 'p2', 'results'], index=range(3))
    df_master['p1'] = np.random.rand(len(df_master))
    df_master['p2'] = np.random.rand(len(df_master))
    df_master = df_master.astype(object) # make sure generic types can be used
    # loop over each row, call some_operation and store results DataFrame
    for ind, row in df_master.iterrows():
        df_master.loc[ind, "results"] = some_operation(row)
    
    >>> df1 = pd.DataFrame({'a':[1, 2, 3], 'b':[4, 5, 6]})
    >>> df2 = pd.DataFrame({'a':[100], 'b':[200]})
    >>> df1.loc[[0], ['a', 'b']] = df2
    >>> df1
         a    b
    0  100  200
    1    2    5
    2    3    6
    
    如果这种语法还允许将数据帧存储为对象,那么不难想象用户的意图是不明确的,并且不明确并不能成为一个好的API

  • 数据帧应该以这种方式使用吗

  • 只要您知道该方法的性能缺点(听起来您也知道),我认为这是一种非常适合使用数据帧的方法。例如,我见过一种类似的策略,用于将经过训练的scikit学习估计器存储在一个大的参数网格中进行交叉验证(尽管我现在还不记得这一点的确切上下文…

    Ok是有意义的。我不知道你表现出的.loc fill行为。谢谢