【问题标题】:Converting certain columns into different data type and filter those columns将某些列转换为不同的数据类型并过滤这些列
【发布时间】:2016-07-08 11:46:21
【问题描述】:

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

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

我可以这样做,分别为每一列但是我的数据框很大并且有很多列

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

此外,我需要根据以距离开头的列过滤掉那些行,并得到两列作为输出,所以我作为输入数据框的最终输出是,

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

我尝试使用以下代码到达那里,也就是说,我正在过滤那些以距离 >=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

任何帮助或建议都会非常棒。!!!

【问题讨论】:

  • 您可以订购您编写的数据框,以便它们实际上有列吗?这种方式很难阅读。
  • Head1 是重复列,有机会时编辑数据框

标签: python numpy pandas dataframe


【解决方案1】:

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

我的 Dataframe 设置与您的不同,但足够接近。与问题无关的栏目我没有填写。

这是我的设置代码:

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 的 dtype 更改为 int,并且只保留距离 >= 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

下次您提出问题时,不要对潜在的回答者如此苛刻。提供设置代码!!!

您必须稍微修改此解决方案以与您的实际列名对齐,由于重复列问题,我不确定它们实际上应该被称为什么。 HTH!

【讨论】:

  • 我认为这是正确的方法,我使用了相同的方法。然而,当您在连接列之前收集数字时,如果它高于 10,则可能是错误的。
  • 好收获。我现在正在工作,但我会尽快修复
【解决方案2】:

如果要更改以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

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

【讨论】:

  • 列的名称以 Distance* 开头,因此名称为 Distance0、distance1、Distance2..DistanceN。并且许多距离列都有 Nan 值。
  • 是的,这要好得多,谢谢!但是您想如何创建具有三列的数据框?更准确地说,Distance 列是什么?它是包含DistanceDistance0 中的值的所有列的总和吗? N可以超过10吗?
  • 但是您想如何创建具有三列的数据框? --我现在已经在我的问题中展示了..输入数据框的 3 列数据框应该如何。更准确地说,距离列是什么?它是包含距离的所有列的总和还是距离 0 中的值? .--没有每个距离列是独立的。每个距离对应于名为Head的前列*
  • 好的,那么输出中的Distance 列是什么? PC 也一样
  • 因此,例如,我输出的第三行看到第一个值 KLM 的 DSQ 距离 >100000 ,但在输入中,KLM 有 DSQ 、 AAD 和 DH 但只有 DSQ 在我们的过滤器中所以输出的标准只有 DSQ。 Head1 PC 距离 KLM DSQ 120001
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-19
  • 2020-10-06
  • 1970-01-01
相关资源
最近更新 更多