<p>此代码将给出您想要的结果:</p>
<pre><code>import pandas as pd
import itertools
# definition of dataframe
df = pd.DataFrame()
df["Index"] = [0, 1, 2, 4, 5, 6, 8, 9, 10]
df["Name"] = ["John", "Mike", "Lisa", "Franck", "Peter", "Suzanne", "Laura", "Sam", "Manon"]
df["Position"] = ["Analyst", "Programmer", "Supervisor", "Analyst", "Programmer", "Programmer", "Supervisor", "Analyst", "Analyst"]
df["HourlyPay"] = [15.00, 18.00, 16.75, 15.50, 17.00, 18.00, 16.00, 12.00, 13.00]
# dict of dataframes by position
unique_positions = list(df["Position"].unique())
pos_dfs = {}
for pos in unique_positions:
pos_dfs[pos] = df.loc[df["Position"]==pos].reset_index()
# required positions with count
req_pos_count = pd.DataFrame.from_dict({"count":{"Analyst": 2, "Supervisor": 1, "Programmer": 1}})
req_pos_unique = list(req_pos_count.index.unique())
req_pos_dfs = [pos_dfs[pos] for pos in req_pos_unique]
which_pos = [item for _, row in req_pos_count.iterrows() for item in [row.name]*row["count"]]
which_pos_count = [str(i) + "_" + pos for i, pos in enumerate(which_pos)]
# combinations
pos_dfs_rows = [list(itertools.combinations(range(len(pos_df)), req_pos_count.loc[req_pos_unique[i]]["count"]))
for i, pos_df in enumerate(req_pos_dfs)]
pos_dfs_rows_comb = [[it for item in sublist for it in item]
for sublist in list(itertools.product(*pos_dfs_rows)) ]
# building of result
uniqueDf = pd.DataFrame(index=range(len(pos_dfs_rows_comb)), columns=which_pos_count+["TotalHourlyPay"])
for k, comb in enumerate(pos_dfs_rows_comb):
rows = [pos_dfs[which_pos[i]].ix[ind] for i, ind in enumerate(comb)]
tp = pd.concat(rows, axis=1, ignore_index=True).transpose()
uniqueDf.loc[k, which_pos_count] = list(tp["Name"])
uniqueDf["TotalHourlyPay"].loc[k] = tp["HourlyPay"].sum()
uniqueDf.sort_values(by="TotalHourlyPay", inplace=True)
</code></pre>