我有一个非常大的数据框(大约100万行),其中包含来自一个实验(60名受访者)的数据。
我想将 Dataframe 拆分为60个 Dataframe (每个参与者一个 Dataframe )。
在 Dataframe 中, data
,有一个变量称为 'name'
,这是每个参与者的唯一代码。
我尝试了以下方法,但没有发生任何事情(或者执行不会在一小时内停止)。我打算做的是把这两份文件分开 data
放入较小的 Dataframe 中,并将其附加到列表中( datalist
):
import pandas as pd
def splitframe(data, name='name'):
n = data[name][0]
df = pd.DataFrame(columns=data.columns)
datalist = []
for i in range(len(data)):
if data[name][i] == n:
df = df.append(data.iloc[i])
else:
datalist.append(df)
df = pd.DataFrame(columns=data.columns)
n = data[name][i]
df = df.append(data.iloc[i])
return datalist
我没有收到错误消息,脚本似乎永远在运行!
有没有聪明的方法?
11条答案
按热度按时间sigwle7e1#
容易的:
q9yhzks02#
groupby可以帮助您:
然后,您可以处理每个组,就像处理每个参与者的 Dataframe 一样。和dataframegroupby对象方法,例如(apply、transform、aggregate、head、first、last)返回dataframe对象。
或者你可以从中列出清单
grouped
并按索引获取所有 Dataframe :vptzau2j3#
除了gusev slava的答案之外,您可能还需要使用groupby的组:
这将生成一个字典,其中包含您分组所依据的键,指向相应的分区。这样做的好处是键被维护,并且不会在列表索引中消失。
ergxz8rk4#
这里有一个groupby(您可以任意应用,而不是求和)
总和是cythonized这就是为什么这是如此之快
fdx2calv5#
基于列表理解和分类的方法
groupby
-它将所有拆分的 Dataframe 存储在列表变量中,并且可以使用索引进行访问。例子
s71maibg6#
首先,op中的方法可行,但效率不高。因为数据集很长,所以它似乎一直在运行。
使用
.groupby
上'method'
列,并创建一个dict
属于DataFrames
独特的'method'
值作为键,使用dict-comprehension
..groupby
返回一个groupby
对象,该对象包含有关组的信息,其中g
这是唯一的价值'method'
对于每组,以及d
是DataFrame
那一组。这个
value
各key
在里面df_dict
,将是一个DataFrame
,可通过标准方式访问,df_dict['key']
.最初的问题需要一个答案
list
属于DataFrames
,这可以通过list-comprehension
df_list = [d for _, d in df.groupby('method')]
```import pandas as pd
import seaborn as sns # for test dataset
load data for example
df = sns.load_dataset('planets')
display(df.head())
0 Radial Velocity 1 269.300 7.10 77.40 2006
1 Radial Velocity 1 874.774 2.21 56.95 2008
2 Radial Velocity 1 763.000 2.60 19.84 2011
3 Radial Velocity 1 326.030 19.40 110.62 2007
4 Radial Velocity 1 516.220 10.50 119.47 2009
Using a dict-comprehension, the unique 'method' value will be the key
df_dict = {g: d for g, d in df.groupby('method')}
print(df_dict.keys())
[out]:
dict_keys(['Astrometry', 'Eclipse Timing Variations', 'Imaging', 'Microlensing', 'Orbital Brightness Modulation', 'Pulsar Timing', 'Pulsation Timing Variations', 'Radial Velocity', 'Transit', 'Transit Timing Variations'])
or a specific name for the key, using enumerate (e.g. df1, df2, etc.)
df_dict = {f'df{i}': d for i, (g, d) in enumerate(df.groupby('method'))}
print(df_dict.keys())
[out]:
dict_keys(['df0', 'df1', 'df2', 'df3', 'df4', 'df5', 'df6', 'df7', 'df8', 'df9'])
```
df_dict['df1].head(3)
或df_dict['Astrometry'].head(3)
这一组只有两个有关seaborn数据集的更多信息
nasa系外行星
或者
这是一种手动方法,用于创建单独的
DataFrames
使用Pandas:布尔索引这与公认的答案相似,但是
.loc
不需要。这是一种可以接受的方法,用于创建两个额外的
DataFrames
.创建多个对象的python方法是将它们放置在一个容器中(例如。
dict
,list
,generator
等),如上图所示。wwtsj6pe7#
如果已经有了一些数据标签,则可以使用groupby命令。
下面是一个详细的示例:
假设我们想使用一些标签将一个pd系列划分为一个区块列表,例如,
in_series
是:及其相应的
label_series
是:跑
返回
out_list
A.list
两个人pd.Series
:请注意,您可以从中使用一些参数
in_series
自身对系列进行分组,例如。,in_series.index.day
krcsximq8#
我也有类似的问题。我有10家不同商店和50种不同商品的每日销售时间序列。我需要将原始 Dataframe 拆分为500个 Dataframe (10个存储*50个存储),以便将机器学习模型应用到每个 Dataframe 中,但我无法手动执行。
这是 Dataframe 的头部:
我创建了两个列表;一个用于 Dataframe 的名称,另一个用于数组的耦合[项目编号,存储编号]。
一旦这两个列表准备好,您就可以循环使用它们来创建所需的 Dataframe :
通过这种方式,我创建了500个 Dataframe 。
希望这将是有益的!
5t7ly7z59#
首先,您的方法是低效的,因为逐行添加到列表会很慢,因为当没有足够的空间容纳新条目时,它必须周期性地增加列表。在这方面,列表理解更好,因为大小是预先确定并分配一次的。
然而,我认为基本上你的方法有点浪费,因为你已经有了一个 Dataframe ,那么为什么要为每个用户创建一个新的 Dataframe 呢?
我将按列对 Dataframe 进行排序
'name'
,将索引设置为此,如果需要,请不要删除该列。然后生成所有唯一项的列表,然后可以使用这些项执行查找,最重要的是,如果只查询数据,则使用选择条件在 Dataframe 上返回视图,而不会产生昂贵的数据拷贝。
使用
pandas.DataFrame.sort_values
及pandas.DataFrame.set_index
:tpgth1q710#
我可以问一下,为什么不直接对 Dataframe 进行切片呢。差不多
嘿,普雷斯托,你有一个 Dataframe 字典,就像(我想)你想要的那样。需要访问一个吗?进来
希望有帮助
vddsk6oq11#
你可以转换
groupby
反对tuples
然后去dict
:不建议这样做,但可以按组创建 Dataframe :