python for循环映射到数据帧

时间:2017-12-15 19:48:30

标签: python pandas dataframe

我有两个清单:

number = [21, 44]
access = ["denied", "Try Again"]

我将这两个变量合并为一个对象:

testInput = [number, access]

testInput的输出:

[[21, 44], ['denied', 'Try Again']]

现在我想循环遍历testInput并提取值并将它们映射到数据框内的键。

以下是我的尝试:

for number, access in testInput:
    df = df.append({'Access Message': access, 'Number': number},ignore_index=True)
print df

输出df:

  Access Message  Number
0             44      21
1      Try Again  denied

我面临的问题是,数字(44)的值在不应该返回时作为访问值返回。

当我打印号码'在for循环中我得到了

21
denied

我最终想要df作为for循环的输出

  Access Message  Number
0         denied      21
1      Try Again      44

我在for循环中做错了吗?或者我可以在for循环之前做一些不同的事情吗?

3 个答案:

答案 0 :(得分:2)

你可以使用

df = pd.DataFrame({'Access Message': access, 'Number': number})

产生期望的结果

  Access Message  Number
0         denied      21
1      Try Again      44

如果您确实要将现有数据框附加到评论中提到的@Tim,则可以

for ni, aci in zip(number, access):
     df = df.append({'Access Message': aci, 'Number': ni}, ignore_index=True)

给出(我只是附加到我上面创建的df

  Access Message  Number
0         denied      21
1      Try Again      44
2         denied      21
3      Try Again      44

但我想对于大型列表更有效的方法是使用concat(同样@Wen在评论中建议):

append_me = pd.DataFrame(zip(number, access)).rename(columns={0: 'Number', 1: 'Access Message'})

df = pd.concat([df, append_me])

给出(我再次附加到前一个数据帧)

  Access Message  Number
0         denied      21
1      Try Again      44
2         denied      21
3      Try Again      44
0         denied      21
1      Try Again      44

答案 1 :(得分:0)

您正在使用两个值进行迭代:angular.module('filter.parselinks',[]) .filter('parseLinks', ParseLinks); function ParseLinks() { var LINKY_URL_REGEXP = /((ftp|https?):\/\/|(www\.)|(mailto:)?[A-Za-z0-9._%+-]+@)\S*[^\s.;,(){}<>"\u201d\u2019]/i, MAILTO_REGEXP = /^mailto:/i; var isDefined = angular.isDefined; var isFunction = angular.isFunction; var isObject = angular.isObject; var isString = angular.isString; return function(text, target, attributes) { if (text == null || text === '') return text; if (typeof text !== 'string') return text; var attributesFn = isFunction(attributes) ? attributes : isObject(attributes) ? function getAttributesObject() {return attributes;} : function getEmptyAttributesObject() {return {};}; var match; var raw = text; var html = []; var url; var i; while ((match = raw.match(LINKY_URL_REGEXP))) { // We can not end in these as they are sometimes found at the end of the sentence url = match[0]; // if we did not match ftp/http/www/mailto then assume mailto if (!match[2] && !match[4]) { url = (match[3] ? 'http://' : 'mailto:') + url; } i = match.index; addText(raw.substr(0, i)); addLink(url, match[0].replace(MAILTO_REGEXP, '')); raw = raw.substring(i + match[0].length); } addText(raw); return html.join(''); function addText(text) { if (!text) { return; } html.push(text); } function addLink(url, text) { var key, linkAttributes = attributesFn(url); html.push('<a '); for (key in linkAttributes) { html.push(key + '="' + linkAttributes[key] + '" '); } if (isDefined(target) && !('target' in linkAttributes)) { html.push('target="', target, '" '); } html.push('href="', url.replace(/"/g, '&quot;'), '">'); addText(text); html.push('</a>'); } }; } 但是您的testInput没有这样分开。所有数字都在第一项中,所有访问消息都在第二项中。你想要的是一个数字访问列表 _pairs 。 EG

for num, access in...

[(21, 'denied'), (44, 'Try Again'), (99, 'someMessage') ...]

这会获取每个列表中的第一项(pairs = zip(testInput[0], testInput[1])testInput[0])并将它们匹配在一起。因此,第一个数字在第一次访问时被放入元组,第二个数字在第二次访问时被放入...等等。

然后通过for循环运行testInput[1]

pairs

答案 2 :(得分:0)

而不是:

Blocking Mask

尝试:

Ignore Raycast

testInput = [number, access] 方法通过交错两个列表来创建对。所以,它会给出

testInput = zip(number, access)

哪个应该与你想要做的很好地吻合。