【问题标题】:pandas add row instead of column熊猫添加行而不是列
【发布时间】:2015-09-20 21:02:09
【问题描述】:

我是 pandas 的新手,但想简单地添加一行

class Security:
    def __init__(self):
        self.structure = ['timestamp', 'open', 'high', 'low', 'close', 'vol']
        self.df = pd.DataFrame(columns=self.structure)  # index =
    def whats_inside(self):
        return self.df
    """
    Some skipped code...
    """
    def add_data(self, timestamp, open, high, low, close, vol):
        data = [timestamp, open, high, low, close, vol]
        self.df = self.df.append (data)

sec = Security()
print sec.whats_inside()
sec.add_data ('2015/06/01', '1', '2', '0.5', '1', '100')
print sec.whats_inside()

但输出是:

            0 close high  low open timestamp  vol
0  2015/06/01   NaN  NaN  NaN  NaN       NaN  NaN
1           1   NaN  NaN  NaN  NaN       NaN  NaN
2           2   NaN  NaN  NaN  NaN       NaN  NaN
3         0.5   NaN  NaN  NaN  NaN       NaN  NaN
4           1   NaN  NaN  NaN  NaN       NaN  NaN
5         100   NaN  NaN  NaN  NaN       NaN  NaN

这意味着,我添加的是列而不是行。是的,我试过用谷歌搜索,但仍然不明白如何让它变得简单。

附言我知道这很简单,但我只是错过了一些重要的事情。

【问题讨论】:

    标签: python pandas append


    【解决方案1】:

    有几种方法可以添加新行。也许最简单的一个是(如果你想将行添加到末尾)是使用loc

    df.loc[len(df)] = ['val_a', 'val_b', .... ]
    

    loc 需要一个索引。 len(df) 将返回数据帧中的行数,因此新行将添加到数据帧的末尾。

    '['val_a', 'val_b', .... ]' 是行的值的列表,列的顺序相同,所以列表的长度必须等于列数,否则你会得到一个ValueError 异常。 一个例外是,如果您希望所有列都具有相同的值,则可以将该值作为列表中的单个元素,例如 df.loc[len(df)] = ['aa']

    注意: 一个好主意是在使用此方法之前始终使用reset_index,因为如果您曾经删除行或处理过滤的数据框,则无法保证行的索引将与行数保持同步。

    【讨论】:

    • 偶然发现这个解决方案(使用 loc 而不是 append)WAY FASTER 所以任何人都应该考虑使用它。
    • 对我来说效果很好。这似乎不是很明显......还是pythonic?还有其他更容易想出的方法吗?我的印象是 pandas 在编写时并没有考虑到附加行。
    • @Chogg 请参阅.append.concat。但是,这些可能比使用 .loc
    • @deepspace 非常感谢。我使用这些命令会出现奇怪的行为,其中行将变成列。
    【解决方案2】:

    您应该附加 Series 或 DataFrame。 (系列会更适合你的情况)

    import pandas as pd
    from pandas import Series, DataFrame
    class Security:
        def __init__(self):
            self.structure = ['timestamp', 'open', 'high', 'low', 'close', 'vol']
            self.df = pd.DataFrame(columns=self.structure)  # index =
        def whats_inside(self):
            return self.df
        """
        Some skipped code...
        """
        def add_data(self, timestamp, open, high, low, close, vol):
            data = [timestamp, open, high, low, close, vol]
            # append Series
            self.df = self.df.append(pd.Series(data, index=self.structure), ignore_index=True)
            # or DataFrame
            # self.df = self.df.append(pd.DataFrame([data], columns=self.structure), ignore_index=True)
    
    sec = Security()
    print sec.whats_inside()
    sec.add_data ('2015/06/01', '1', '2', '0.5', '1', '100')
    sec.add_data ('2015/06/02', '1', '2', '0.5', '1', '100')
    print sec.whats_inside()
    

    输出:

        timestamp open high  low close  vol
    0  2015/06/01    1    2  0.5     1  100
    1  2015/06/02    1    2  0.5     1  100
    

    【讨论】:

    • 这是有史以来最好的解决方案!我丑陋的努力的唯一工作是: data = [[timestamp], [open], [high], [low], [close], [vol]] mydict = dict (zip (self.structure, data)) new = pd.DataFrame (mydict) self.table = self.table.append (new) 这太糟糕了。非常感谢!
    猜你喜欢
    • 2016-01-13
    • 2023-02-26
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 2022-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多