假设我在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之间。
我该怎么做?
答案 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
。