如何根据应用于多列的分析条件创建包含有序列表的 pandas 数据框
How to create a pandas dataframe that contains ordered lists based on analysis conditions applied on multiple columns
我正在做一个 Python 项目,它有一个像这样的数据框:
col = {
'ID': ['123.abc', '123.abc', '123.abc', '456.efg', '456.efg', '123.abc', '123.abc', '789.hij'],
'Content': ['AAA', 'BBB', 'CCC', 'BBB', 'DDD', 'AAA', 'CCC', 'AAA'],
'Visit sequence': ['1', '2', '3', '1', '2', '1', '2', '1'],
'Value': ['0', '0', '5.21', '0', '9.74', '0', '0', '3.83']}
df = pd.DataFrame(col)
这导致以下数据table:
ID
Content
Visit sequence
Value
123.abc
AAA
1
0
123.abc
BBB
2
0
123.abc
CCC
3
5.21
456.efg
BBB
1
0
456.efg
DDD
2
9.74
123.abc
AAA
1
0
123.abc
CCC
2
0
789.hij
AAA
1
3.83
任务包括生成以下数据帧:
ID
Journey
Value
123.abc
AAA, BBB, CCC
5
123.abc
AAA, CCC
0
456.efg
BBB, DDD
4
789.hij
AAA
1
其中 Journey
列包含 Contents
的列表,直到在 Value
列中获得金额。在Value
栏中找不到金额的内容也被认为是旅程,如您所见ID
123.abc.
的情况
你能帮我推荐一个解决这个任务的代码吗?我有点找到了这个任务的解决方案,但是由于我使用了很多循环函数,所以我无法将该算法应用于更大的数据库,因为时间处理太长了。
老实说,我不清楚值列,但我会提供我的解决方案,其中只有此列的最终计算 missing/not 正确。也许它很简单,您可以轻松适应:
i = df.ID
df["group"] = i.ne(i.shift()).cumsum()
df2 = df[["ID", "group","Content", "Value"]].groupby(["ID", "group"]). \
agg({'Content' : ','.join,
"Value":"last"}).reset_index()
df2 = df2.rename(columns={"Content":"Journey"}).drop("group", axis=1)
输出:
ID Journey Value
0 123.abc AAA,BBB,CCC 5.21
1 123.abc AAA,CCC 0
2 456.efg BBB,DDD 9.74
3 789.hij AAA 3.83
通过 'ID' 和非 0 'Value' 的 cumsum 进行分组就可以了:
df2 = (df.groupby([df['ID'], ((df['Value']!='0').shift().fillna(0)).cumsum()], as_index=False)
.agg({'Content' : ','.join, 'Value':'last'})
)
输出:
ID Content Value
-- ------- ----------- -------
0 123.abc AAA,BBB,CCC 5.21
1 123.abc AAA,CCC 0
2 456.efg BBB,DDD 9.74
3 789.hij AAA 3.83
我正在做一个 Python 项目,它有一个像这样的数据框:
col = {
'ID': ['123.abc', '123.abc', '123.abc', '456.efg', '456.efg', '123.abc', '123.abc', '789.hij'],
'Content': ['AAA', 'BBB', 'CCC', 'BBB', 'DDD', 'AAA', 'CCC', 'AAA'],
'Visit sequence': ['1', '2', '3', '1', '2', '1', '2', '1'],
'Value': ['0', '0', '5.21', '0', '9.74', '0', '0', '3.83']}
df = pd.DataFrame(col)
这导致以下数据table:
ID | Content | Visit sequence | Value |
---|---|---|---|
123.abc | AAA | 1 | 0 |
123.abc | BBB | 2 | 0 |
123.abc | CCC | 3 | 5.21 |
456.efg | BBB | 1 | 0 |
456.efg | DDD | 2 | 9.74 |
123.abc | AAA | 1 | 0 |
123.abc | CCC | 2 | 0 |
789.hij | AAA | 1 | 3.83 |
任务包括生成以下数据帧:
ID | Journey | Value |
---|---|---|
123.abc | AAA, BBB, CCC | 5 |
123.abc | AAA, CCC | 0 |
456.efg | BBB, DDD | 4 |
789.hij | AAA | 1 |
其中 Journey
列包含 Contents
的列表,直到在 Value
列中获得金额。在Value
栏中找不到金额的内容也被认为是旅程,如您所见ID
123.abc.
你能帮我推荐一个解决这个任务的代码吗?我有点找到了这个任务的解决方案,但是由于我使用了很多循环函数,所以我无法将该算法应用于更大的数据库,因为时间处理太长了。
老实说,我不清楚值列,但我会提供我的解决方案,其中只有此列的最终计算 missing/not 正确。也许它很简单,您可以轻松适应:
i = df.ID
df["group"] = i.ne(i.shift()).cumsum()
df2 = df[["ID", "group","Content", "Value"]].groupby(["ID", "group"]). \
agg({'Content' : ','.join,
"Value":"last"}).reset_index()
df2 = df2.rename(columns={"Content":"Journey"}).drop("group", axis=1)
输出:
ID Journey Value
0 123.abc AAA,BBB,CCC 5.21
1 123.abc AAA,CCC 0
2 456.efg BBB,DDD 9.74
3 789.hij AAA 3.83
通过 'ID' 和非 0 'Value' 的 cumsum 进行分组就可以了:
df2 = (df.groupby([df['ID'], ((df['Value']!='0').shift().fillna(0)).cumsum()], as_index=False)
.agg({'Content' : ','.join, 'Value':'last'})
)
输出:
ID Content Value
-- ------- ----------- -------
0 123.abc AAA,BBB,CCC 5.21
1 123.abc AAA,CCC 0
2 456.efg BBB,DDD 9.74
3 789.hij AAA 3.83