<p>我认为你需要:</p>
<pre><code># create a list of both columns on groupby
new_df = df.groupby('Id', as_index=False).aggregate({"Subject": lambda x: x.to_list(), "Number_Of_Tests": lambda x: x.to_list()})
# create a new column `Grade` based on condition
new_df["Grade"] = ["A" if all(j>5 for j in i) else "B" for i in new_df["Number_Of_Tests"]]
# create a column Tests using other 2 columns
new_df["Tests"] = [{k:v for k,v in zip(i,j)} for i,j in zip(new_df["Subject"], new_df["Number_Of_Tests"])]
# drop unwanted columns
new_df.drop(["Subject","Number_Of_Tests"], axis=1, inplace=True)
</code></pre>
<p>输出:</p>
<pre><code> Id Grade Tests
0 101 A {'Maths': 6, 'Science': 8, 'History': 10}
1 102 B {'History': 5, 'Maths': 4, 'Science': 7}
</code></pre>
<p><strong>编辑</strong>:</p>
<pre><code>mask1 = (df["Subject"] == "Maths") & (df["Number_Of_Tests"] > 3)
mask2 = (df["Subject"] == "Science") & (df["Number_Of_Tests"] > 5)
mask3 = (df["Subject"] == "History") & (df["Number_Of_Tests"] > 7)
df["Grades"] = np.select([mask1, mask2, mask3], ["A", "A", "A"], "B")
def func(x):
if "B" in x.values:
return "B"
return "A"
new_df = df.groupby('Id', as_index=False).aggregate({"Subject": lambda x: x.to_list(),
"Number_Of_Tests": lambda x: x.to_list(),
"Grades": func})
new_df["Tests"] = [{k:v for k,v in zip(i,j)} for i,j in zip(new_df["Subject"], new_df["Number_Of_Tests"])]
new_df.drop(["Subject","Number_Of_Tests"], axis=1, inplace=True)
</code></pre>