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]