我想为以下问题找到一个熊猫解决方案(数据帧实际上很长,因此性能确实是一个重要的主题):
我有一个输入数据框df,需要构建一个新的数据框dfNew,在这里我需要从其他列的值中导出“ rs”列中的输出。
所需的逻辑如下:
t
始终从0稳定地增加到最大值。之后,它再次从0开始。t
= 0且下一个即将到来的pt
='X'(包括)范围内,都应将td
列的值用作结果列rs
,否则应将列md
的列rs
的值。 从其他列中导出rs
的基于熊猫的解决方案会是什么样子?
td = ['td0','td1','td2','td3','td4','td5','td6','td7','td8','td9','td10','td11','td12']
md = ['md0','md1','md2','md3','md4','md5','md6','md7','md8','md9','md10','md11','md12']
t = [ 0 , 1 , 2 , 3 , 0 , 1 , 2 , 3 , 4 , 5 , 0 , 1 , 2 ]
pt = [ 'n', 'n', 'X', 'n', 'n', 'n', 'n', 'X', 'n', 'n', 'n', 'X', 'n']
df = pd.DataFrame({'td': td, 'md': md, 't': t, 'pt': pt}, columns=['td', 'md', 't', 'pt'])
df
td md t pt
0 td0 md0 0 n
1 td1 md1 1 n
2 td2 md2 2 X
3 td3 md3 3 n
4 td4 md4 0 n
5 td5 md5 1 n
6 td6 md6 2 n
7 td7 md7 3 X
8 td8 md8 4 n
9 td9 md9 5 n
10 td10 md10 0 n
11 td11 md11 1 X
12 td12 md12 2 n
dfNew
td md t pt rs
0 td0 md0 0 n td0
1 td1 md1 1 n td1
2 td2 md2 2 X td2
3 td3 md3 3 n md3
4 td4 md4 0 n td4
5 td5 md5 1 n td5
6 td6 md6 2 n td6
7 td7 md7 3 X td7
8 td8 md8 4 n md8
9 td9 md9 5 n md9
10 td10 md10 0 n td10
11 td11 md11 1 X td11
12 td12 md12 2 n md12
答案 0 :(得分:1)
这是我对style="text-align: center;"
和style="margin: 0 auto; text-align: center;"
的看法
groupby
输出:
cumsum
答案 1 :(得分:1)
我已经构建了一种算法,可以在每个X
之后中断序列。但不确定效率如何。
# store pt to list
pt_list = df.pt.tolist()
# iterate through the list to get the index of each n after each X
md_map = {}
for idx, item in enumerate(pt_list):
if item == "X" and idx != df.index.max():
key = idx+1
value = "md"
md_map[key] = value
# map it with data frame
df["td_md"] = df.index.map(md_map)
# fill the na with td
df["td_md"] = df.td_md.fillna("td")
# create rs column from index and td_md
df["rs"] = df.td_md + df.index.astype(str)
我不认为毗邻每一个条件。但是您必须构建类似的东西。