我有一只DataFrame
熊猫:
import pandas as pd
inp = [{'c1':10, 'c2':100}, {'c1':11,'c2':110}, {'c1':12,'c2':120}]
df = pd.DataFrame(inp)
print df
Run Code Online (Sandbox Code Playgroud)
输出:
c1 c2
0 10 100
1 11 110
2 12 120
Run Code Online (Sandbox Code Playgroud)
现在我想迭代这个帧的行.对于每一行,我希望能够通过列的名称访问其元素(单元格中的值).例如:
for row in df.rows:
print row['c1'], row['c2']
Run Code Online (Sandbox Code Playgroud)
是否有可能在熊猫中做到这一点?
我发现了类似的问题.但它没有给我我需要的答案.例如,建议使用:
for date, row in df.T.iteritems():
Run Code Online (Sandbox Code Playgroud)
要么
for row in df.iterrows():
Run Code Online (Sandbox Code Playgroud)
但我不明白row
对象是什么以及如何使用它.
如何在熊猫中做到这一点:
我extract_text_features
在单个文本列上有一个函数,返回多个输出列.具体来说,该函数返回6个值.
该函数有效,但似乎没有任何正确的返回类型(pandas DataFrame/numpy数组/ Python列表),以便输出可以正确分配 df.ix[: ,10:16] = df.textcol.map(extract_text_features)
所以我认为我需要回到迭代df.iterrows()
,按照这个?
更新:迭代df.iterrows()
速度至少慢20倍,所以我投降并将函数拆分为六个不同的.map(lambda ...)
调用.
我正在使用itertuples迭代一个pandas数据帧.我也想捕获行号.迭代时:
示例代码:
for row in df.itertuples():
print row['name']
Run Code Online (Sandbox Code Playgroud)
预期产量:
1 larry
2 barry
3 michael
Run Code Online (Sandbox Code Playgroud)
这里1,2,3是行号.我想避免使用计数器并获取行号.有没有简单的方法来实现这个使用熊猫?
如果我有一个功能
def do_irreversible_thing(a, b):
print a, b
Run Code Online (Sandbox Code Playgroud)
还有一个数据帧
df = pd.DataFrame([(0, 1), (2, 3), (4, 5)], columns=['a', 'b'])
Run Code Online (Sandbox Code Playgroud)
对于pandas数据帧中的每一行,只 运行一次函数的最佳方法是什么?正如其他问题所指出的那样,像df.apply pandas这样的东西会在第一行调用该函数两次.即使使用numpy
np.vectorize(do_irreversible_thing)(df.a, df.b)
Run Code Online (Sandbox Code Playgroud)
导致函数在第一行被调用两次,df.T.apply()
或者df.apply(...,axis = 1).
有没有比这个显式循环更快或更清晰的方法来调用每一行的函数?
for idx, a, b in df.itertuples():
do_irreversible_thing(a, b)
Run Code Online (Sandbox Code Playgroud) 以下所有内容似乎都适用于迭代熊猫系列的元素。我相信有更多的方法可以做到这一点。有什么区别,哪种方法最好?
import pandas
arr = pandas.Series([1, 1, 1, 2, 2, 2, 3, 3])
# 1
for el in arr:
print(el)
# 2
for _, el in arr.iteritems():
print(el)
# 3
for el in arr.array:
print(el)
# 4
for el in arr.values:
print(el)
# 5
for i in range(len(arr)):
print(arr.iloc[i])
Run Code Online (Sandbox Code Playgroud) 我正在尝试处理非常大的文件(10,000+观察),其中邮政编码不容易格式化.我需要将它们全部转换为前5位数,这是我当前的代码:
def makezip(frame, zipcol):
i = 0
while i < len(frame):
frame[zipcol][i] = frame[zipcol][i][:5]
i += 1
return frame
Run Code Online (Sandbox Code Playgroud)
frame是数据帧,zipcol是包含邮政编码的列的名称.虽然这有效,但处理需要很长时间.有更快的方法吗?
我有DataFrame,我试图将每列中的所有值分配为该列的总和.
x = pd.DataFrame(data = [[1,2],[3,4],[5,6],[7,8],[9,10]],index=[1,2,3,4,5],columns=['a','b'])
x
a b
1 1 2
2 3 4
3 5 6
4 7 8
5 9 10
Run Code Online (Sandbox Code Playgroud)
输出应该是
a b
1 25 30
2 25 30
3 25 30
4 25 30
5 25 30
Run Code Online (Sandbox Code Playgroud)
我想使用x.apply(f,axis = 0),但我不知道如何定义一个将列转换为lambda函数中所有列值之和的函数.以下行引发SyntaxError:无法分配给lambda
f = lambda x : x[:]= x.sum()
Run Code Online (Sandbox Code Playgroud) 我正在给一个玩具示例,但它会帮助我理解我正在尝试做的其他事情.假设我想要一个数据框'optimal_fruit'中的新列,即apple*orange - bananas.
我可以做这样的事情来获得它.
df2['optimal_fruit'] = df2['apples'] * df2['oranges'] - df2['bananas']
apples oranges bananas optimal_fruit
1 6 11 -5
2 7 12 2
3 8 13 11
4 9 14 22
5 10 15 35
Run Code Online (Sandbox Code Playgroud)
如果我尝试做这样的事情会发生什么?我怎么能在列表理解中做到这一点?
df2['optimal_fruit'] = [x * y - z for x in df2['apples'] for y in df2['oranges'] for z in df2['bananas']]
Run Code Online (Sandbox Code Playgroud)
我得到一个错误:
ValueError:值的长度与索引的长度不匹配
一如既往,非常感谢你的帮助!
假设我们有一个包含A,B和C列的数据框:
df = pd.DataFrame(columns =('A','B','C'), index=range(1))
Run Code Online (Sandbox Code Playgroud)
列包含三行数值:
0 A B C
1 2.1 1.8 1.6
2 2.01 1.81 1.58
3 1.9 1.84 1.52
Run Code Online (Sandbox Code Playgroud)
如何循环遍历从1到3的每一行,然后执行if语句,包括添加一些变量:
if B1 > 1.5
calc_temp = A1*10
calc_temp01 = C1*-10
if B2 > 1.5
calc_temp = A2*10
calc_temp01 = C2*-10
if B3 >1.5
calc_temp = A3*10
calc_temp01 = C3*-10
Run Code Online (Sandbox Code Playgroud)
甚至可能吗?它必须知道一系列的种类,即带有某种计数器的全范围数据集号,是吗?if语句应该引用该特定行.