【发布时间】:2021-09-06 09:01:50
【问题描述】:
我是 python 新手,下面提到的是我目前正在尝试解决的一个持续的数据工程问题。
表结构
数据:
索引 1:
是连续的并且会随着行的增加而增加 1。
索引 2:问题
这取决于存储在 [A,B,C,D,E] 列中的值。如果值保持不变,我们需要为这些行分配一个索引。
例如:第 1、2、3 行分别具有 567 作为 A、B、C 的值。 因此,这 3 行的索引 2 为 100。
记录类型:
- 1-A
- 2-B
- 3-C
- 4-D
- 5 - E
代码
data = [(100, 100, 1 , 567,'','','','') ,
(101, 100, 2 , '',567,'','','') ,
(102, 100, 3 , '','',567,'','') ,
(103, 101, 3 , '','',568,'','') ,
(104, 101, 4 , '','','',568,'') ,
(105, 101, 5 , '','','','',568) ]
#Creates the data frame
df = pd.DataFrame( data, columns = ['index1' , 'index2', 'record_type' , 'A','B','C','D','E'], dtype=str)
#Combines columns A,B,C,D,E and adds a $ where ever it is null in order to stack these values
df['combined'] = df[['A', 'B', 'C','D','E']].stack().groupby(level=0).agg('$'.join)
# Cleans the column 'combined'
df['combined_cleaned']= df['combined'].replace({'\$':''}, regex = True)
尝试使用 combine_cleaned 列来计算 index2。 不确定这是否是正确的方法,欢迎提出建议。
【问题讨论】:
-
几个澄清问题。 (1) 用于计算的列数是否始终相同,是否始终标记为“A 到 E”? (2) 如果值 567 稍后出现在数据框中会发生什么情况(例如 index1 = 109,列 D = 567?
-
df[list('ABCDE')].T.agg(''.join).factorize()[0] + 100应该足够了 -
@itprorh66 回答您的问题: 1) 总列数 = 6:这是固定的。 2) 如果 D 或 E 列有 567,则 index2 的值为 100 基本上,我们只能在单行中的 A 到 E 列中具有单个值。因此,如果 567 出现在 D 列中,那将是一个新行,其 index1 值为 106,index2 值为 100。
标签: python-3.x pandas indexing