如何访问串联存储的单个元组值?

时间:2019-08-06 15:27:47

标签: python dataframe tuples series

我有一个在每个单元格中包含一个元组的数据框。

import pandas as pd
inp = [[(11,110), (12,120)], 
       [(13,130), (14,140), (15,150)]]
df = pd.DataFrame(inp)

for index, row in df.iterrows():
    print(row)

enter image description here

我希望以行迭代的方式访问每个元素。如您所见,iterrows()以行方式返回一系列元组,但不返回其单个值。例如,它给了我(11,110)...(15,150)。我想将它们拆分为一个整数。

期望的结果应该使我可以按行方式按索引访问元组的单个值。例如,在行迭代中,我可以从index [0]获得11、12、13、14、15,而从index [1]获得110、120、130、140、150

是否可以在iterrows()中这样做?

提前谢谢!

1 个答案:

答案 0 :(得分:2)

首先,仅将DataFrame.iterrows()作为最后的手段。 DataFrame已针对一次对整个列的矢量化操作进行了优化,而不是针对逐行操作进行了优化。而且,如果必须进行迭代,请考虑使用DataFrame.itertuples(),因为它可以保留每一列的数据类型,并且运行速度快得多。

第二,在Pandas(以及所有的计算)中,重要的是要针对即将完成的任务适当地构造数据。您当前的解决方案将沿索引和时间点的人员作为列。如您的示例所示,这形成了一个宽广且参差不齐的矩阵,其中可能包含许多NaN。听起来您想为DataFrame的每个单元存储四个数据元素:人员,时间,x和y。考虑在每个时间点使用四列而不是一列,

import pandas as pd
inp = [[(11,110), (12,120)], 
       [(13,130), (14,140), (15,150)]]
df = pd.DataFrame(inp)  # ragged and wide--not ideal for Pandas

df2 = df.stack()  # now each element is indexed by a MultiIndex (person and time).
df2.index.rename(["person", "time"], inplace=True)  # to be explicit

df3 = pd.DataFrame(df2.tolist(), index=df2.index)  # now each row is a person/time and there are two columns for x and y
df3.reset_index(inplace=True)  # not strictly necessary
df3.rename(columns={0: "x", 1: "y"}, inplace=True)  # to be explicit

for row in df3.itertuples():  # using itertuples instead of iterrows
    print(row)
# Pandas(Index=0, person=0, time=0, x=11, y=110)
# Pandas(Index=1, person=0, time=1, x=12, y=120)
# Pandas(Index=2, person=1, time=0, x=13, y=130)
# Pandas(Index=3, person=1, time=1, x=14, y=140)
# Pandas(Index=4, person=1, time=2, x=15, y=150)

您应该查看this answer,了解我如何拆分元组。当然,如果您能够控制数据的构造方式,则无需进行这种操作-只需首先使用适当的结构创建DataFrame。

现在,您可以将df3["x"]df3["y"]视为pandas.Series对象,以执行所需的任何操作:

for x in df3["x"]:
    print(x)
# 11
# 12
# 13
# 14
# 15

for y in df3["y"]:
    print(y)
# 110
# 120
# 130
# 140
# 150

print(df3["x"] * df3["y"]/5 + 1)
# 0    243.0
# 1    289.0
# 2    339.0
# 3    393.0
# 4    451.0
# dtype: float64