访问数据框中与其他列共享名称的列

时间:2014-08-13 21:05:59

标签: python python-2.7 pandas

我有三个不同的列,每个列都名为Weight (LB)。当我打印出列名时,pandas似乎使用Weight (LB)Weight (LB).1以及Weight (LB).2来区分它们。所以我尝试逐个访问每个,同时迭代行并将它们的值附加到单独的列表中。我应该得到3个大小为22的列表,但我有3个大小为66的列表。每个列表都获得Weight (LB)列中的所有值。所以我打开它并尝试访问特定的列索引。当然,这是行不通的!但我最终在同一条船上。

>>> for idx, row in df.iterrows():
...     squat.append(df.iloc[idx, 6])
...     if row['Exercise 2'] == 'Overhead press':
...             overhead.append(df.iloc[idx, 14])
...     else:
...             bench.append(df.iloc[idx, 14])
...     if row['Exercise 3'] == 'Deadlift':
...             deadlift.append(df.iloc[idx, 22])
...     else:
...             barbell.append(df.iloc[idx, 22])
... 
>>> len(squat)
66

基本上,我需要帮助的是分别访问特定列中的数据,尽管它们具有相同的名称。

谢谢!

编辑:我可以通过iloc正确访问每个列,但无论出于何种原因,所有值都会添加到每个列表中。 O_O

再次编辑:我注意到当我使用squat = bench = overhead = deadlift = barbell = []创建列表时,它会产生意外行为,但当我在各自的行上创建列表时,它会按预期工作。

1 个答案:

答案 0 :(得分:0)

我只是重命名你的专栏,一般来说它会让生活变得更轻松。重复项有点棘手,但您可以使用某种映射函数直接分配给列。

def rename_dup(col):
    ans = []
    counter = 1
    for c in col:
        if c.startswith('Weight (LB)'):
            ans.append(c + str(counter))
            counter += 1
        else:
            ans.append(c)

    return ans

df.columns = rename_dup(df.columns)

此外,您可能不想使用itterrows。写这样的东西可能比较干净:

overhead =  df.loc[df['Exercise 2'] == 'Overhead press', 'Weight(LB)2']
bench =  df.loc[df['Exercise 2'] != 'Overhead press', 'Weight(LB)2']
# etc...