Tôi biết đây là một câu hỏi cũ, nhưng tôi đã có gặp rắc rối khi nhận được câu trả lời của Wes để làm việc cho nhiều cột trong khung dữ liệu, vì vậy tôi đã làm cho mã của anh ta chung chung hơn một chút. Nghĩ rằng tôi sẽ chia sẻ trong trường hợp bất cứ ai khác tình cờ gặp câu hỏi này với cùng một vấn đề.
Bạn chỉ về cơ bản xác định cột nào có số đếm trong đó và bạn nhận lại một khung dữ liệu mở rộng.
import pandas as pd
df = pd.DataFrame({'class 1': ['A','B','C','A'],
'class 2': [ 1, 2, 3, 1],
'count': [ 3, 3, 3, 1]})
print df,"\n"
def f(group, *args):
row = group.irow(0)
Dict = {}
row_dict = row.to_dict()
for item in row_dict: Dict[item] = [row[item]] * row[args[0]]
return pd.DataFrame(Dict)
def ExpandRows(df,WeightsColumnName):
df_expand = df.groupby(df.columns.tolist(), group_keys=False).apply(f,WeightsColumnName).reset_index(drop=True)
return df_expand
df_expanded = ExpandRows(df,'count')
print df_expanded
Returns:
class 1 class 2 count
0 A 1 3
1 B 2 3
2 C 3 3
3 A 1 1
class 1 class 2 count
0 A 1 1
1 A 1 3
2 A 1 3
3 A 1 3
4 B 2 3
5 B 2 3
6 B 2 3
7 C 3 3
8 C 3 3
9 C 3 3
Liên quan đến tốc độ, df cơ sở của tôi là 10 cột bằng ~ 6k hàng và khi mở rộng là ~ 100.000 hàng mất ~ 7 giây. Tôi không chắc chắn trong trường hợp này nếu nhóm là cần thiết hoặc khôn ngoan vì nó lấy tất cả các cột để hình thành nhóm, nhưng hey bất cứ điều gì chỉ 7 giây.
Nguồn
2015-05-04 21:25:03
Tôi cũng lưu ý một chức năng chung cho phép trả về nhiều, một hoặc 0 hàng tùy thuộc vào giá trị trong cột 'đếm'. – btel
Nếu bạn đến với câu hỏi này vào năm 2017+, hãy kiểm tra câu trả lời của tôi để có giải pháp hiệu quả và dễ hiểu hơn. –