0

我有一个加权的数据边缘列表。它由连接的源、目标和权重组成。像这样:

  source destination  weight
0      A           B       3
1      A           C       2
2      A           D       3

我希望它采用不包含重量值的通用格式。原因是我使用的应用程序没有考虑数据集中的权重值。像这样:

  source destination
0      A           B
1      A           B
2      A           B
3      A           C
4      A           C
5      A           D
6      A           D
7      A           D

我试过使用reset_index()unstack()但我得到的结果与我需要的完全不同。有什么建议么 ?

4

3 回答 3

3

您可以使用pd.Index.repeat()并传递该weight列来获得该重复次数,然后在下面调用它df.loc[]

df.loc[df.index.repeat(df.weight),['source','destination']].reset_index(drop=True)

替代代码np.repeat()

final=(pd.DataFrame(np.repeat(df[['source','destination']].values,
  df.weight,axis=0),columns=['source','destination']))

  source destination
0      A           B
1      A           B
2      A           B
3      A           C
4      A           C
5      A           D
6      A           D
7      A           D
于 2019-07-19T11:16:00.750 回答
1

使用生成器功能巧妙地完成。为简单起见,假设数据是 3 元组(源、目标、权重)的列表。

def weighted_to_general(edges):
    for source, destination, weight in edges:
        # Memory optimization: store the tuple only once
        source_destination = (source, destination)
        for n in range(weight):
            yield source_destination


data = [
    ('A', 'B', 3),
    ('A', 'C', 2),
    ('B', 'D', 3),
]

for source_destination in weighted_to_general(data):
    print(source_destination)

如果您需要一个列表,只需使用以下方法迭代生成器list()

general_data = list(weighted_to_general(data))
于 2019-07-19T11:04:23.963 回答
1

你可以试试:

df = pd.DataFrame({'source': ['A', 'A', 'B'], 'destination': ['B', 'C', 'D'], 'weight': [3, 2, 3]})

result = list()
for index, row in df.iterrows():
    for x in range(row.weight):
        result.append([row.source, row.destination])
print(pd.DataFrame(result, columns=['source', 'destination']))

结果:

  source destination
0      A           B
1      A           B
2      A           B
3      A           C
4      A           C
5      B           D
6      B           D
7      B           D
于 2019-07-19T11:09:39.460 回答