将一系列数字分为不同的行-熊猫

时间:2019-05-24 12:31:45

标签: python pandas numpy

我有一个具有这样的列值的数据框:

 num_range      id      description
'5000-6000'      1        lmn
'6100-6102'      1        lmn
'6363-6363'      3        xyz
'Q7890-Q8000'    2        pqr

因此,有一种方法可以编写一个循环,该循环将拆分为多个行并为我提供值,例如。对于第一个num_range值,如下所示:

num_range      id      description
   5000          1        lmn
   5001          1        lmn
   5002          1        lmn
   .....        ...       ....
   5999          1        lmn 
   6000          1        lmn
   Q7891         2        pqr
   Q7892         2        pqr
   ...          ...       ...
   Q8000         2        pqr

与明智的做法一样,我想要所有num_range值以及iddescription的行。

2 个答案:

答案 0 :(得分:1)

使用Series.str.findall获取数字值,如果在最后一行中的QNetworkRequest nr; nr.setSslConfiguration(this->sslConf); nr.setUrl(QUrl("https://myserver.com/services/abc")); //HTTP Basic authentication header value: base64(username:password) QString concatenated = username + ":" + pw; QByteArray data = concatenated.toLocal8Bit().toBase64(); QString headerData = "Basic " + data; nr.setRawHeader("Authorization", headerData.toLocal8Bit()); QNetworkReply *reply = netAccessManager.get(nr); reply->ignoreSslErrors(); QObject::connect(reply, SIGNAL(sslErrors(const QList<QSslError>)), this, SLOT(sslError(const QList<QSslError>))); 等非数字值之前,也可以使用,然后使用列表推导方式创建Series by,并将F创建为原始值:

join

如果在数字首先用Series.str.extract提取此值之前还需要第一个值,则替换print (df) num_range id description 0 5000-5005 1 lmn 1 6100-6102 1 lmn 2 6363-6363 3 xyz 3 Q7890-Q7893 2 pqr s = df.pop('num_range').str.findall('\d+') a = [(i, x) for i, (a, b) in s.items() for x in range(int(a), int(b) + 1)] s = pd.DataFrame(a).set_index(0)[1].rename('num_range') df = df.join(s) print (df) id description num_range 0 1 lmn 5000 0 1 lmn 5001 0 1 lmn 5002 0 1 lmn 5003 0 1 lmn 5004 0 1 lmn 5005 1 1 lmn 6100 1 1 lmn 6101 1 1 lmn 6102 2 3 xyz 6363 3 2 pqr 7890 3 2 pqr 7891 3 2 pqr 7892 3 2 pqr 7893 脚趾字符串并映射到列表理解中:

-

答案 1 :(得分:0)

这有点蛮力,但说明了一种明确的方式。 一个人也可以以一种奇特的方式使用.apply等来消除一些循环

# going to save it here
newdf = pd.DataFrame()

for _, row in df.iterrows():
   # split num_range and cast to a list of ints
   s, e = [x for x in map(int, row.num_range.split("-"))]

   # need to add one to e cause we need to include it
   for n in range(s, e+1):
       # replace the number on the row you've iterated on.
       row.num_range = n
       newdf = newdf.append(row)