Pandas Python告诉我们如何获得groupby的反面
我有两个数据帧。除了一列之外,它们是相同的。我想根据第一个数据帧的平均值更改第二个数据帧的列。对于后者,我必须使用groupby,但我不知道如何获得相反的结果。下面是一个最小的示例,在这个特定的示例中,df_2应该与df_1相同。我的问题是如何从tmp到df2_new-参见下面的代码Pandas Python告诉我们如何获得groupby的反面,pandas,mean,pandas-groupby,Pandas,Mean,Pandas Groupby,我有两个数据帧。除了一列之外,它们是相同的。我想根据第一个数据帧的平均值更改第二个数据帧的列。对于后者,我必须使用groupby,但我不知道如何获得相反的结果。下面是一个最小的示例,在这个特定的示例中,df_2应该与df_1相同。我的问题是如何从tmp到df2_new-参见下面的代码 import pandas as pd def foo(df1, df2): # Group by A groupsA_one = dict(list(df1.groupby('A', as_i
import pandas as pd
def foo(df1, df2):
# Group by A
groupsA_one = dict(list(df1.groupby('A', as_index=False)))
groupsA_two = dict(list(df2.groupby('A', as_index=False)))
for key_A in groupsA_one:
# Group by B
groupsB_one = dict(list(groupsA_one[key_A].groupby('B', as_index=False)))
groupsB_two = dict(list(groupsA_two[key_A].groupby('B', as_index=False)))
for key_B in groupsB_one:
# Group by C
tmp = groupsB_two[key_B].groupby('C', as_index=False)['D'].mean() # Returns DataFrame with NaN
tmp['D'] = groupsB_one[key_B].groupby('C', as_index=False)['D'].mean()['D']
print tmp
df2_new = [] # ???
return df2_new
if __name__ == '__main__':
A1 = {'A': [1, 1, 1, 1, 2, 2, 2, 2], 'B': [1, 1, 2, 2, 1, 1, 2, 2],
'C': [1, 2, 1, 2, 1, 2, 1, 2], 'D': [5, 5, 5, 5, 5, 5, 5, 5]}
A2 = {'A': [1, 1, 1, 1, 2, 2, 2, 2], 'B': [1, 1, 2, 2, 1, 1, 2, 2],
'C': [1, 2, 1, 2, 1, 2, 1, 2], 'D': [0, 0, 0, 0, 0, 0, 0, 0]}
df_one = pd.DataFrame(A1)
df_two = pd.DataFrame(A2)
foo(df_one, df_two)
这是我想要的解决方案。请,如果你找到一个更优雅的解决方案,我会很乐意把它作为一个正确的答案 Hre它是:
import pandas as pd
import numpy as np
def foo(df):
# Group by A
groups_a_one = dict(list(df.groupby('A', as_index=False)))
for key_a in groups_a_one:
# Group by B
groups_b_one = dict(list(groups_a_one[key_a].groupby('B', as_index=False)))
for key_b in groups_b_one:
# Group by C
tmp = groups_b_one[key_b].groupby('C', as_index=False).transform(lambda x: x.fillna(x.mean()))
df.ix[tmp.index, 'D'] = tmp['D']# assign mean values to correct lines in df
return df
if __name__ == '__main__':
A1 = {'A': [1, 1, 1, 1, 2, 2, 2, 2], 'B': [1, 1, 2, 2, 1, 1, 2, 2],
'C': [1, 2, 1, 2, 1, 2, 1, 2], 'D': [5, 5, 5, 5, 5, 5, 5, 5]}
A2 = {'A': [1, 1, 1, 1, 2, 2, 2, 2], 'B': [1, 1, 2, 2, 1, 1, 2, 2],
'C': [1, 2, 1, 2, 1, 2, 1, 2], 'D': [np.NaN, np.NaN, np.NaN, np.NaN, np.NaN, np.NaN, np.NaN, np.NaN]}
df_one = pd.DataFrame(A1)
df_two = pd.DataFrame(A2)
df = pd.concat([df_one, df_two], axis=0, ignore_index=True)# To get only one DataFrame
# run the transform
foo(df)
以下是初始状态和最终状态:
# Initial
A B C D
0 1 1 1 5
1 1 1 2 5
2 1 2 1 5
3 1 2 2 5
4 2 1 1 5
5 2 1 2 5
6 2 2 1 5
7 2 2 2 5
8 1 1 1 NaN
9 1 1 2 NaN
10 1 2 1 NaN
11 1 2 2 NaN
12 2 1 1 NaN
13 2 1 2 NaN
14 2 2 1 NaN
15 2 2 2 NaN
# Final
A B C D
0 1 1 1 5
1 1 1 2 5
2 1 2 1 5
3 1 2 2 5
4 2 1 1 5
5 2 1 2 5
6 2 2 1 5
7 2 2 2 5
8 1 1 1 5
9 1 1 2 5
10 1 2 1 5
11 1 2 2 5
12 2 1 1 5
13 2 1 2 5
14 2 2 1 5
15 2 2 2 5
这是我想要的解决方案。请,如果你找到一个更优雅的解决方案,我会很乐意把它作为一个正确的答案 Hre它是:
import pandas as pd
import numpy as np
def foo(df):
# Group by A
groups_a_one = dict(list(df.groupby('A', as_index=False)))
for key_a in groups_a_one:
# Group by B
groups_b_one = dict(list(groups_a_one[key_a].groupby('B', as_index=False)))
for key_b in groups_b_one:
# Group by C
tmp = groups_b_one[key_b].groupby('C', as_index=False).transform(lambda x: x.fillna(x.mean()))
df.ix[tmp.index, 'D'] = tmp['D']# assign mean values to correct lines in df
return df
if __name__ == '__main__':
A1 = {'A': [1, 1, 1, 1, 2, 2, 2, 2], 'B': [1, 1, 2, 2, 1, 1, 2, 2],
'C': [1, 2, 1, 2, 1, 2, 1, 2], 'D': [5, 5, 5, 5, 5, 5, 5, 5]}
A2 = {'A': [1, 1, 1, 1, 2, 2, 2, 2], 'B': [1, 1, 2, 2, 1, 1, 2, 2],
'C': [1, 2, 1, 2, 1, 2, 1, 2], 'D': [np.NaN, np.NaN, np.NaN, np.NaN, np.NaN, np.NaN, np.NaN, np.NaN]}
df_one = pd.DataFrame(A1)
df_two = pd.DataFrame(A2)
df = pd.concat([df_one, df_two], axis=0, ignore_index=True)# To get only one DataFrame
# run the transform
foo(df)
以下是初始状态和最终状态:
# Initial
A B C D
0 1 1 1 5
1 1 1 2 5
2 1 2 1 5
3 1 2 2 5
4 2 1 1 5
5 2 1 2 5
6 2 2 1 5
7 2 2 2 5
8 1 1 1 NaN
9 1 1 2 NaN
10 1 2 1 NaN
11 1 2 2 NaN
12 2 1 1 NaN
13 2 1 2 NaN
14 2 2 1 NaN
15 2 2 2 NaN
# Final
A B C D
0 1 1 1 5
1 1 1 2 5
2 1 2 1 5
3 1 2 2 5
4 2 1 1 5
5 2 1 2 5
6 2 2 1 5
7 2 2 2 5
8 1 1 1 5
9 1 1 2 5
10 1 2 1 5
11 1 2 2 5
12 2 1 1 5
13 2 1 2 5
14 2 2 1 5
15 2 2 2 5
我认为在某些情况下,这可能更简单:
groupby=dfm.groupby('变量')
对于ix,反向(元组(groupby))中的行:
...
我认为在某些情况下这可能更简单:
groupby=dfm.groupby('变量')
对于ix,反向(元组(groupby))中的行:
...
你在找什么?这将返回一个数据帧,其索引与lhs dataframeWell对齐,我不确定。我所做的是:我将数据帧df1和df2分组,首先按“A”,然后按“B”,然后按“C”。在“C”级,我计算df1组的平均值,然后将其分配给df2组。因为这是一个很小的例子,这个平均值实际上是一个恒等式,但通常不是。我希望在df2或df2_中也可以看到在df2组上完成的这些任务。pandas transform可以这样做吗?是的,我认为这就是你想要的,最好添加预期的输出,这样就很清楚预期的输出是A2['D']=A1['D'],所以在转换后df_2应该和df_1相同。我只是在看.transform,但是当我有几个级别的groupby时,我不知道如何使用它。你在找吗?这将返回一个数据帧,其索引与lhs dataframeWell对齐,我不确定。我所做的是:我将数据帧df1和df2分组,首先按“A”,然后按“B”,然后按“C”。在“C”级,我计算df1组的平均值,然后将其分配给df2组。因为这是一个很小的例子,这个平均值实际上是一个恒等式,但通常不是。我希望在df2或df2_中也可以看到在df2组上完成的这些任务。pandas transform可以这样做吗?是的,我认为这就是你想要的,最好添加预期的输出,这样就很清楚预期的输出是A2['D']=A1['D'],所以在转换后df_2应该和df_1相同。我只是在看.transform,但是当我有几个级别的groupby时,我不知道如何使用它。