Python 对于具有多个结果的循环
我有以下虚拟数据帧:Python 对于具有多个结果的循环,python,pandas,numpy,for-loop,automation,Python,Pandas,Numpy,For Loop,Automation,我有以下虚拟数据帧: df = pd.DataFrame([[1,50,60],[5,70,80],[2,120,30],[3,125,450],[5,80,90],[4,100,200],[2,1000,2000],[1,10,20]],columns = ['A','B','C']) A B C 0 1 50 60 1 5 70 80 2 2 120 30 3 3 125 450 4 5 80 90 5
df = pd.DataFrame([[1,50,60],[5,70,80],[2,120,30],[3,125,450],[5,80,90],[4,100,200],[2,1000,2000],[1,10,20]],columns = ['A','B','C'])
A B C
0 1 50 60
1 5 70 80
2 2 120 30
3 3 125 450
4 5 80 90
5 4 100 200
6 2 1000 2000
7 1 10 20
我现在是python中的for循环,我想知道是否有可能让for循环在python中生成多个结果。我想使用for循环打破上述数据框,其中对于A列中的每个变量,我希望有新的df,并根据B列对其进行排序,并将C列乘以2:
df1 =
A B C
1 10 40
1 20 120
我不确定这是否可以用Python实现。通常我使用matlab,为此,我在python脚本中尝试了以下方法:
def f(df):
for i in np.unique(df['A'].values):
df = df.sort_values(['A','B'])
df = df['C'].assign(C = lambda x: x.C*2)
print df
当然,这是错误的,因为它不会生成df1、df2…df5等多个结果(该变量必须以1,2…5结尾,以便可以跟踪或跟随数据帧的A列)。谁能帮我一下吗?我知道这在没有for循环(矢量化)的情况下是很容易做到的,但我在A列中有许多独特的值,我想在它们上运行for循环,我还想了解更多关于Python中的循环的信息。非常感谢。使用速度比系列快。独特的。
也可以选择将数据帧保存在字典中。
对列表使用字典的优点是,它可以将密码与列表中的值相匹配
df2=df.copy()
df2['C']=df2['C']*2
df2=df2.sort_values('B')
dfs={i:group for i,group in df2.groupby('A')}
根据中的值访问字典:
for key in dfs:
print(f'dfs[{key}]')
print(dfs[key])
print('_'*20)
dfs[1]
A B C
7 1 10 80
0 1 50 240
____________________
dfs[2]
A B C
2 2 120 120
6 2 1000 8000
____________________
dfs[3]
A B C
3 3 125 1800
____________________
dfs[4]
A B C
5 4 100 800
____________________
dfs[5]
A B C
1 5 70 320
4 5 80 360
您要做的是按列A
分组,然后将生成的数据帧存储到按A
值索引的dict中。这样做的代码是
df_dict = {}
for ix, gp in df.groupby('A'):
new_df = gp.sort_values('B')
new_df['C'] = 2*new_df['C']
df_dict[ix] = new_df
然后变量df_list
包含按列B
和列C
乘以2排序的所有结果数据帧。比如说
print(df_dict[1])
A B C
1 10 40
1 50 120
分块前的排序和乘法:
df['C'] = 2* df['C']
[group for name, group in df.sort_values(by=['A','B']).groupby('A')]
或者,如果您想要口述:
{name: group for name, group in df.sort_values(by=['A','B']).groupby('A')}
我有类似的答案,比如安瑟夫:
df = pd.DataFrame([[1,50,60],[5,70,80],[2,120,30],[3,125,450],[5,80,90],[4,100,200],[2,1000,2000],[1,10,20]],columns = ['A','B','C'])
A = np.unique(data['A'].values)
df_result = []
for a in A:
df1 = df.loc[df['A'] == a]
df1 = df1.sort_values('B')
df1 = df1.assign(C = lambda x: x.C*2)
df_result+=[df1]
我仍然无法自动执行此操作,因为结果为df_result1、df_result2…df_result5。我所能做的只是将每个循环的结果调用为df_result[0]、df_result[1]、…df_result[4] 多个结果-使用列表存储以前的结果,在末尾返回。然后a=1位于位置0?通过使用dict
而不是list
,您可以通过a
的值对数据帧进行索引-editedit成功地将使用更改为字典,但是我已经提出了这一点,此外,没有必要初始化空字典。您需要以某种方式定义df_dict
,否则您将得到namererror
,最好在之前进行排序,因此不必使用循环排序方法。这是对存储的dict
的低效选择。您仍然需要对B
进行排序,然后将C
相乘。你能在听写理解中做到这一点吗?我认为这个列表使阅读变得困难,使用字典更容易
print(df_dict[1])
A B C
1 10 40
1 50 120
df['C'] = 2* df['C']
[group for name, group in df.sort_values(by=['A','B']).groupby('A')]
{name: group for name, group in df.sort_values(by=['A','B']).groupby('A')}
df = pd.DataFrame([[1,50,60],[5,70,80],[2,120,30],[3,125,450],[5,80,90],[4,100,200],[2,1000,2000],[1,10,20]],columns = ['A','B','C'])
A = np.unique(data['A'].values)
df_result = []
for a in A:
df1 = df.loc[df['A'] == a]
df1 = df1.sort_values('B')
df1 = df1.assign(C = lambda x: x.C*2)
df_result+=[df1]