Python 数据帧应该嵌套吗?
我正在创建一个python脚本,它驱动一个旧的fortran代码来定位地震。我想在python脚本中改变fortran代码的输入参数,并在数据帧中记录结果以及产生结果的值。每次运行的结果也可以方便地放入一个数据帧中,这样我就有了一个嵌套的数据帧(即分配给数据帧元素的数据帧)。例如: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['
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_操作函数返回一个列表、字典等,它似乎可以正常工作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行为。谢谢