我有一个如下所示的DataFrame
:
class passed failed extra_teaching
A11 1 2 0.5
A12 2 1 0.7
我想“解开”DataFrame
,并丢失有关类(class)的信息,但保留有关 extra_teaching
的信息,因此我最终为每个人生成一行通过的学生。
因此,DataFrame
最终应如下所示:
pass extra_teaching
1 0.5
0 0.5
0 0.5
1 0.7
1 0.7
0 0.7
我不知道如何在 pandas
中执行此操作,除非使用 iterrows()
并手动将行附加到新的 DataFrame
- 有谁有更简洁的方法吗?
更新:
我尝试过这个,似乎可以工作,但不是很优雅:
temp = []
df = df.set_index('class')
for idx in df.index:
row = df.loc[idx]
t = {'class': idx, 'extra_teaching': row['extra_teaching']}
for i in range(0, int(row['passed'])):
t['pass'] = 1
temp.append(t)
for i in range(0, int(row['failed'])):
t['pass'] = 0
temp.append(t)
df_exploded = pd.DataFrame(temp)
最佳答案
尝试:
def teaching_results(x):
num_rows = x.passed.iloc[0] + x.failed.iloc[0]
passed = x.passed.iloc[0] * [1] + x.failed.iloc[0] * [0]
extra_teaching = num_rows * [x.extra_teaching.iloc[0]]
class_code = x['class'].iloc[0]
return pd.DataFrame({'pass': passed, 'extra_teaching': extra_teaching, 'class': class_code})
df.groupby('class', as_index=False).apply(lambda x: teaching_results(x))
获取:
class extra_teaching pass
0 0 A11 0.5 1
1 A11 0.5 0
2 A11 0.5 0
1 0 A12 0.7 1
1 A12 0.7 1
2 A12 0.7 0
关于python - 如何使用行的值 'unravel' 数据帧?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36602988/