Mar*_*ger 72 python split dataframe pandas
我有一个非常大的数据帧(大约100万行)和实验数据(60个受访者).我想将数据帧拆分为60个数据帧(每个参与者的数据帧).
在数据框(称为= data)中,有一个名为"name"的变量,它是每个参与者的唯一代码.
我尝试了以下,但没有任何反应(或者不会在一小时内停止).我打算做的是将数据帧(数据)拆分成更小的数据帧并将它们附加到列表(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
Run Code Online (Sandbox Code Playgroud)
我没有收到错误消息,脚本似乎永远都会运行!
有一种聪明的方法吗?
Woo*_*ide 59
我可以问为什么不通过切片数据框来做到这一点.就像是
#create some data with Names column
data = pd.DataFrame({'Names': ['Joe', 'John', 'Jasper', 'Jez'] *4, 'Ob1' : np.random.rand(16), 'Ob2' : np.random.rand(16)})
#create unique list of names
UniqueNames = data.Names.unique()
#create a data frame dictionary to store your data frames
DataFrameDict = {elem : pd.DataFrame for elem in UniqueNames}
for key in DataFrameDict.keys():
DataFrameDict[key] = data[:][data.Names == key]
Run Code Online (Sandbox Code Playgroud)
嘿presto你有一个数据框架的字典就像(我认为)你想要它们.需要访问一个?输入
DataFrameDict['Joe']
Run Code Online (Sandbox Code Playgroud)
希望有所帮助
EdC*_*ica 45
首先,你的方法是低效的,因为逐行附加到列表将是缓慢的,因为当新条目的空间不足时必须定期增加列表,在这方面列表推导更好,因为确定了大小前面并分配一次.
但是,我认为从根本上说你的方法有点浪费,因为你已经拥有了一个数据框,那么为什么要为每个用户创建一个新数据框呢?
我会按列对数据帧进行排序'name',将索引设置为此值,如果需要则不删除列.
然后生成所有唯一条目的列表,然后您可以使用这些条目执行查找,并且至关重要的是,如果您只查询数据,请使用选择标准返回数据框上的视图,而不会产生代价高昂的数据副本.
所以:
# sort the dataframe
df.sort(columns=['name'], inplace=True)
# set the index to be this and don't drop
df.set_index(keys=['name'], drop=False,inplace=True)
# get a list of names
names=df['name'].unique().tolist()
# now we can perform a lookup on a 'view' of the dataframe
joe = df.loc[df.name=='joe']
# now you can query all 'joes'
Run Code Online (Sandbox Code Playgroud)
sort现已弃用,您sort_values现在需要使用:
# sort the dataframe
df.sort_values(by='name', axis=1, inplace=True)
# set the index to be this and don't drop
df.set_index(keys=['name'], drop=False,inplace=True)
# get a list of names
names=df['name'].unique().tolist()
# now we can perform a lookup on a 'view' of the dataframe
joe = df.loc[df.name=='joe']
# now you can query all 'joes'
Run Code Online (Sandbox Code Playgroud)
jez*_*ael 35
您可以将groupby对象转换为tuples然后转换为dict:
df = pd.DataFrame({'Name':list('aabbef'),
'A':[4,5,4,5,5,4],
'B':[7,8,9,4,2,3],
'C':[1,3,5,7,1,0]}, columns = ['Name','A','B','C'])
print (df)
Name A B C
0 a 4 7 1
1 a 5 8 3
2 b 4 9 5
3 b 5 4 7
4 e 5 2 1
5 f 4 3 0
d = dict(tuple(df.groupby('Name')))
print (d)
{'b': Name A B C
2 b 4 9 5
3 b 5 4 7, 'e': Name A B C
4 e 5 2 1, 'a': Name A B C
0 a 4 7 1
1 a 5 8 3, 'f': Name A B C
5 f 4 3 0}
print (d['a'])
Name A B C
0 a 4 7 1
1 a 5 8 3
Run Code Online (Sandbox Code Playgroud)
Gus*_*ava 14
Groupby可以帮助您:
grouped
然后,您可以使用每个参与者的数据框来处理每个组.而DataFrameGroupBy对象方法(如apply,transform,aggregate,head,first,last)返回一个DataFrame对象.
或者您可以l_grouped[0][1]通过索引制作列表并获取所有DataFrame:
grouped - 具有名字的第一组的DataFrame.
除了 Gusev Slava 的回答之外,您可能还想使用 groupby 的组:
{key: df.loc[value] for key, value in df.groupby("name").groups.items()}
Run Code Online (Sandbox Code Playgroud)
这将生成一个字典,其中包含您分组的键,指向相应的分区。优点是键被维护并且不会在列表索引中消失。
简单:
[v for k, v in df.groupby('name')]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
134492 次 |
| 最近记录: |