基于逗号拆分并在 Python 中创建新数据框
split based on comma and create new data frame in Python
假设我有以下数据框。
df
Nodes Weight
A,B 10
A,C,F 8
B,F,D 6
B,E 4
我想根据逗号拆分并保持它们的权重。例如,Nodes (A,C,F)
A 与 C 有联系,C 有联系 F。所以,我想看到 A >>C
,和 C>>F
。不用看A>>F
。并且它们的权重应为 8,如下所示。
我正在寻找的最终数据框如下所示。
Node_1 Node_2 Weight
A B 10
A C 8
C F 8
B F 6
F D 6
B E 4
创建此数据框的目的是从中创建网络图。
有类似的解决方案,但我无法得到我想要的结果。
我尝试了以下方法:
df = (df['Nodes'].str.split(',') .groupby(df['Weight'])
有人可以帮忙吗?
这是一种方法:
# From https://docs.python.org/3/library/itertools.html#itertools-recipes
from itertools import tee
def pairwise(iterable):
"s -> (s0,s1), (s1,s2), (s2, s3), ..."
a, b = tee(iterable)
next(b, None)
return zip(a, b)
df['Node_pairs'] = df['Nodes'].str.split(',').apply(lambda x: list(pairwise(x)))
df = df.explode('Node_pairs')
df['Node1'] = df['Node_pairs'].str[0]
df['Node2'] = df['Node_pairs'].str[1]
df
输出:
Nodes Weight Node_pairs Node1 Node2
0 A,B 10 (A, B) A B
1 A,C,F 8 (A, C) A C
1 A,C,F 8 (C, F) C F
2 B,F,D 6 (B, F) B F
2 B,F,D 6 (F, D) F D
3 B,E 4 (B, E) B E
详情:
- 使用 itertools 文档中的成对配方来创建
'Node_pairs'
- 展开 'Node_pairs'
列表中的数据框
- 使用 .str get 快捷方式分配 'Node1' 和 'Node2'。
逻辑同Scott提供的方案
def grouper(input_list, n = 2):
for i in range(len(input_list) - (n - 1)):
yield input_list[i:i+n]
(df.set_index('Weight')['Nodes']
.str.split(',')
.map(grouper)
.map(list)
.explode()
.apply(pd.Series).add_prefix('Node_')
.reset_index())
Weight Node_0 Node_1
0 10 A B
1 8 A C
2 8 C F
3 6 B F
4 6 F D
5 4 B E
假设我有以下数据框。
df
Nodes Weight
A,B 10
A,C,F 8
B,F,D 6
B,E 4
我想根据逗号拆分并保持它们的权重。例如,Nodes (A,C,F)
A 与 C 有联系,C 有联系 F。所以,我想看到 A >>C
,和 C>>F
。不用看A>>F
。并且它们的权重应为 8,如下所示。
我正在寻找的最终数据框如下所示。
Node_1 Node_2 Weight
A B 10
A C 8
C F 8
B F 6
F D 6
B E 4
创建此数据框的目的是从中创建网络图。
有类似的解决方案,但我无法得到我想要的结果。
我尝试了以下方法:
df = (df['Nodes'].str.split(',') .groupby(df['Weight'])
有人可以帮忙吗?
这是一种方法:
# From https://docs.python.org/3/library/itertools.html#itertools-recipes
from itertools import tee
def pairwise(iterable):
"s -> (s0,s1), (s1,s2), (s2, s3), ..."
a, b = tee(iterable)
next(b, None)
return zip(a, b)
df['Node_pairs'] = df['Nodes'].str.split(',').apply(lambda x: list(pairwise(x)))
df = df.explode('Node_pairs')
df['Node1'] = df['Node_pairs'].str[0]
df['Node2'] = df['Node_pairs'].str[1]
df
输出:
Nodes Weight Node_pairs Node1 Node2
0 A,B 10 (A, B) A B
1 A,C,F 8 (A, C) A C
1 A,C,F 8 (C, F) C F
2 B,F,D 6 (B, F) B F
2 B,F,D 6 (F, D) F D
3 B,E 4 (B, E) B E
详情:
- 使用 itertools 文档中的成对配方来创建 'Node_pairs'
- 展开 'Node_pairs' 列表中的数据框
- 使用 .str get 快捷方式分配 'Node1' 和 'Node2'。
逻辑同Scott提供的方案
def grouper(input_list, n = 2):
for i in range(len(input_list) - (n - 1)):
yield input_list[i:i+n]
(df.set_index('Weight')['Nodes']
.str.split(',')
.map(grouper)
.map(list)
.explode()
.apply(pd.Series).add_prefix('Node_')
.reset_index())
Weight Node_0 Node_1
0 10 A B
1 8 A C
2 8 C F
3 6 B F
4 6 F D
5 4 B E