我有一个具有这样的列值的数据框:
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
值以及id
和description
的行。
答案 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)