如何通过pandas groupby或类似技术构建数据框列?

时间:2019-05-03 10:54:39

标签: python pandas

我想为以下问题找到一个熊猫解决方案(数据帧实际上很长,因此性能确实是一个重要的主题):

我有一个输入数据框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

2 个答案:

答案 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)

我不认为毗邻每一个条件。但是您必须构建类似的东西。