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

时间:2019-05-30 15:26:04

标签: python python-3.x pandas dataframe

假设我在csv中有下表。

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

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

我需要从此DataFrame中创建另一个,其中每个条目代表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值,新DataFrame的sequence值减去1和相同的{ {1}}在两个DataFrame之间。

我该怎么做?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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