创建一个数据帧,其条目是另一个数据帧的行之间的关系?

2024-09-27 09:27:39 发布

您现在位置:Python中文网/ 问答频道 /正文

假设csv中有下表

 elementID | groupID | sequence
     abc   |    A    |    0
     dcv   |    A    |    1
     asd   |    B    |    1
     ccc   |    B    |    0
     abc   |    B    |    2

我在Pandas中将此表作为数据帧导入

我需要从这个数据帧创建另一个数据帧,其中每个条目表示elementID的两个连续元素

例如如下所示

 elementID_1 | elementID_2 | groupID
     abc     |    dcv      |    A
     asd     |    abc      |    B
     ccc     |    asd      |    B

起初,我想到了多行选择,但不知道如何做到这一点

所以我决定一步一步地创建一列。 我首先创建了elementID_2列,如下所示

new_df = pd.DataFrame()
new_df[["elementID_2", "sequence", "groupID"]] = old_df.loc[old_df.loc.sequence>1][["elementID", "sequence", "groupID"]]

现在要创建elementID_1列,我想匹配旧数据帧中具有as sequence值的条目,新数据帧的sequence值减去1,两个数据帧之间具有相同的groupdID

我该怎么做


Tags: csv数据pandasdfnew条目oldloc
2条回答

IIUC,您可以通过shift()对组和dropna执行此操作:

df.sort_values('sequence', inplace=True)
df['elementID_1'] = df.groupby('groupID').elementID.shift()
df.dropna()

输出:

+  +      -+     -+      +       -+
|    | elementID   | groupID   |   sequence | elementID_1   |
|  +      -+     -+      +       -|
|  1 | dcv         | A         |          1 | abc           |
|  2 | asd         | B         |          3 | ccc           |
|  4 | abc         | B         |          4 | asd           |
+  +      -+     -+      +       -+

然后可以删除sequence列并将elementID重命名为elementID_2

这里有一种使用groupby+itertools的方法

s=df.groupby('groupID').elementID.apply(lambda x : set(itertools.combinations(x.values.tolist(), 2)))
df1=pd.DataFrame(s.index.repeat(s.str.len()))
df2=pd.DataFrame(list(itertools.chain(*s.tolist())))
pd.concat([df1,df2],axis=1)
Out[286]: 
  groupID    0    1
0       A  abc  dcv
1       B  asd  abc
2       B  asd  ccc
3       B  ccc  abc

相关问题 更多 >

    热门问题