用介于两者之间的值填充pandas dataframe

2024-09-27 00:17:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我不太熟悉熊猫,但我想学得更好。我现在面临一个问题。我有一个像这样的数据帧:

        0    1    2
0   chr2L    1    4
1   chr2L    9   12
2   chr2L   17   20
3   chr2L   23   23
4   chr2L   26   27
5   chr2L   30   40
6   chr2L   45   47
7   chr2L   52   53
8   chr2L   56   56
9   chr2L   61   62
10  chr2L   66   80

我想要这样的东西:

^{pr2}$

因此,用0填充缺失的间隔,并将当前的间隔保存为1(如果有一种简单的方法可以同时将“边界”位置(初始数据中间隔的边界)保存为0.5,这可能也很有用),同时将所有数据拆分为1个长度的间隔。在

在数据中,列0中有多个字符串值,应该分别对每个字符串值执行此操作。它们需要不同长度的最终数据(最后一个应该得到0或1的值是不同的)。如果你能帮我解决熊猫的问题,我会很感激的。在


Tags: 数据方法字符串间隔边界我会pr2chr2l
1条回答
网友
1楼 · 发布于 2024-09-27 00:17:29

这对你的第一段和第二段的大部分都有效。作为练习:完成插入insideness=0行(参见结尾):

import pandas as pd
# dummied-up version of your data, but with column headers for readability:
df = pd.DataFrame({'n':['a']*4 + ['b']*2, 'a':[1,6,8,5,1,5],'b':[4,7,10,5,3,7]})



# splitting up a range, translated into df row terms:
def onebyone(dfrow):
    a = dfrow[1].a; b = dfrow[1].b; n = dfrow[1].n
    count = b - a
if count >= 2:
    interior = [0.5]+[1]*(count-2)+[0.5]
elif count == 1:
    interior = [0.5]
elif count == 0:
    interior = []

return {'n':[n]*count, 'a':range(a, a + count),
        'b':range(a + 1, a + count + 1),
        'insideness':interior}

编辑后使用pd.concat()(pandas 0.15中的新功能)组合中间结果:

^{pr2}$

最后是标识缺失行的草图,您可以对其进行编辑,以便在向最终数据帧添加行时与上述for循环相匹配:

 # for times in the overall range describing 'a'
 for i in range(int(newd[newd.n=='a'].a.min()),int(newd[newd.n=='a'].a.max())): 
    # if a time isn't in an existing 0.5-1-0.5 range:
    if i not in newd[newd.n=='a'].a.values:
        # these are the values to fill in a 0-row
        print '%d, %d, 0'%(i, i+1)

或者,如果您知道a列将为每个n排序,则可以跟踪onebyone()处理的最后一个结束值,并插入一些额外的行,以赶上将传递给onebyone()的下一个起始值。在

相关问题 更多 >

    热门问题