将某些列转换为不同的数据类型并筛选这些列

2024-09-27 07:20:27 发布

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

我有一个数据框,如下所示

enter image description here

我需要将那些以Distance*开头的列转换成数据类型integer(目前它们是字符串格式),然后进一步过滤这些列。你知道吗

我可以这样做,分别为每一列,但我的数据帧是大的,有许多这些列

a.Distance0=a.Distance0.astype(int)
a.Distance1=a.Distance1.astype(int)

在这之后,我还需要根据以距离开始的列过滤掉这些行,并得到两列作为输出,因此我要从输入数据帧中得到的最终输出是

 Head1     Header   Dis
    ABC    SAP     115590
    ABC    GRN     426250
    KLM    DSQ    120001

我试着用下面的代码来实现这一点,也就是说,我正在过滤那些以Distance>;=100000开头的行,我只需要上面提到的那些具有三列值的行。 这是我尝试过的,但是这个解决方案给出了所有列

a.loc[a[a[a.columns[pd.Series(a.columns).str.startswith('Distance')]] >= 100000].dropna(how='all', axis=0).index]

但它给出了结果,但我得到的行和列都是这样的

RNA             PC                  NA  PC0   Strand0 Distance0   PC1 Strand1 Distance1
RP11 RNF223 (+11559), AGRN (+42625) 0   RNF223  +   115590  AGRN    +   42625
RP13 CORT (-19440), APITD1 (+177)   0   CORT    -   254880  APITD1  +   177

任何帮助或建议都会非常好。!!!你知道吗


Tags: columns数据字符串integerintdistance数据类型abc
2条回答

注意,我已经将您的第一个Head1列重命名为Header(您的示例中有重复的列)。你知道吗

我的数据帧设置与你的不同,但足够接近。我没有填写与问题无关的栏目。你知道吗

这是我的设置代码:

import pandas as pd

df = pd.DataFrame([],
                   columns=["Header",
                   "LongHeader",
                   "Head0",
                   "Strand0",
                   "Distance0",
                   "Head1",
                   "Strand1",
                   "Distance1",
                   "Head2",
                   "Strand2",
                   "Distance2"])
df["Header"] = ["ABC", "EFG", "HIJ", "KLM", "SOS"]
df["LongHeader"] = ["1", "2", "3", "4", "5"]
df["Head0"] = ["SAP", "HES3", "CORT", "AAD", "MFA"]
df["Strand0"] = ["+", "-", "-", "-", "-"]
df["Distance0"] = ["115590", "6350", "19440", "25488", "11174"]
df["Head1"] = ["GRN", "CMT", "API", "DH", "13A2"]
df["Strand1"] = ["+", "-", "-", "-", "-"]
df["Distance1"] = ["426250", "1902", "177", "1341", "19763"]
df["Head2"] = ["None", "None", "None", "DSQ", "None"]
df["Strand2"] = ["+", "-", "-", "-", "-"]
df["Distance2"] = ["None", "None", "None", "120001", "None"]

print df

给出了与您的示例类似的数据:

  Header LongHeader Head0 Strand0 Distance0 Head1 Strand1 Distance1 Head2  
0    ABC          1   SAP       +    115590   GRN       +    426250  None   
1    EFG          2  HES3       -      6350   CMT       -      1902  None   
2    HIJ          3  CORT       -     19440   API       -       177  None   
3    KLM          4   AAD       -     25488    DH       -      1341   DSQ   
4    SOS          5   MFA       -     11174  13A2       -     19763  None 

这是做这项工作的代码。其主要思想是提取Headx和Distancex列,并简单地将它们堆叠在彼此的顶部。然后将Distance的数据类型更改为int,并且只保留Distance>;=100000的行。你知道吗

frames_to_concat = []
for col in df:
    if col.startswith("Dis"):
        dis_num = col[-1] # Extract the # from a column like Distance# or Dis#
        frame_to_concat = df[["Header", "Head" + dis_num, "Distance" + dis_num]]
        frame_to_concat.columns = ["Header", "Head", "Distance"]
        frames_to_concat.append(frame_to_concat)

stacked_columns = pd.concat(frames_to_concat)
stacked_columns = stacked_columns[stacked_columns["Distance"] != "None"]
stacked_columns["Distance"] = stacked_columns["Distance"].astype(int)
result = stacked_columns[stacked_columns["Distance"] > 100000]

print result

它给出:

# Output:
  Header Head  Distance
0    ABC  SAP    115590
0    ABC  GRN    426250
3    KLM  DSQ    120001

下次你问问题的时候,不要对潜在的回答者太苛刻。提供设置代码!!!你知道吗

您将不得不稍微修改这个解决方案,使之与实际的列名保持一致,由于存在重复列名的问题,我不确定实际应该调用什么。嗯!你知道吗

如果要更改以Distance开头的每个列的类型,可以使用循环:

list_col = []
for col in a.columns:
    if (len(col) > 8) & (col[:8] == 'Distance'):
        list_col.appen(col)
a[list_col] = a[list_col].astype(int)

然后创建一个连接不同距离值的数据帧:

frames = []
for i in len(list_col):
    temp = df[['Head1','Header'+str(i),list_col[i]]]
    temp.columns = ['Head1','Header','Distance']
    frames.append(temp)
output = pd.concat(drames)

(请注意,这意味着您的列名格式良好,您可能必须使其适应append中的实际名称)

然后过滤:

output = out[out.Distance >= 100000]

这可能在第一次尝试数据帧时不起作用,因为我假设您的数据帧列(只有我们感兴趣的列)的调用方式如下:

Head1      Header0    Distance0     Header1    Distance1    Header2    Distance2

等等。。。(再说一次,我们不关心其他列,因为它们不会干扰此代码)

相关问题 更多 >

    热门问题