熊猫-逐步添加到DataFrame

时间:2019-07-14 15:36:16

标签: python pandas dataframe

我正在尝试向熊猫逐步添加行和列。我有很多数据存储在多个数据存储中,并通过启发式方法确定值。当我浏览该数据存储区时,我希望能够以增量方式更新数据框,在某些情况下,名称或日期会丢失。

def foo():
    df = pd.DataFrame()
    year = 2016
    names = ['Bill', 'Bob', 'Ryan']
    for day in range(1, 4, 1):
        for name in names:
            if random.choice([True, False]):   # sometimes a name will be missing
                continue
            value = random.randrange(0, 20, 1) # random value from heuristic
            col = '{}_{}'.format(year, day)    # column name
            df = df.append({col: value, 'name': name}, ignore_index=True)
    df.set_index('name', inplace=True, drop=True)
    print(df.loc['Bill'])

这将产生以下结果:

      2016_1  2016_2  2016_3
name                        
Bill    15.0     NaN     NaN
Bill     NaN    12.0     NaN

我已经创建了数据的热图,并且由于名称重复而显得块状,所以我要查找的输出是:

      2016_1  2016_2  2016_3
name                        
Bill    15.0    12.0     NaN

如何合并这些行?

有没有更有效的方法来创建此数据框?

5 个答案:

答案 0 :(得分:2)

尝试一下:

df.pivot_table(index='name', aggfunc='sum', dropna=False)

enter image description here

答案 1 :(得分:2)

尝试一下:-

df.groupby('name')[df.columns.values].sum()

答案 2 :(得分:1)

运行foo()函数之后,可以使用任何聚合函数(如果每列只有一个值并且所有其他都是空)和groupby上的df。 / p>

首先,使用reset_index返回您的name列。
然后使用groupbyapply。在这里,我提出了一个自定义函数,该函数检查每列是否只有一个值,如果没有,则抛出一个ValueError

df.reset_index(inplace=True)

def aggdata(x):
    if all([i <= 1 for i in x.count()]):
        return x.mean()
    else:
        raise ValueError

ddf = df.groupby('name').apply(aggdata)

如果该列的所有值均为空但为1,则x.mean()将返回该值(实际上,几乎可以使用任何聚合器,因为只有一个值,即返回的值)。

答案 3 :(得分:0)

将名称改为列,将日期设为索引会更容易。另外,您可以在循环中使用列表,然后创建pd.DataFrame。

例如

year = 2016
names = ['Bill', 'Bob', 'Ryan']

index = []
valueBill = []
valueBob = []
valueRyan = []

for day in range(1, 4):
    if random.choice([True, False]):   # sometimes a name will be missing
        valueBill.append(random.randrange(0, 20))
        valueBob.append(random.randrange(0, 90))
        valueRyan.append(random.randrange(0, 200)) 
        index.append('{}-0{}'.format(year, day))    # column name
    else:
        valueBill.append(np.nan)
        valueBob.append(np.nan)
        valueRyan.append(np.nan)
        index.append(np.nan)

df = pd.DataFrame({})

for name, value in zip(names,[valueBill,valueBob,valueRyan]):
    df[name] = value
df.set_index(pd.to_datetime(index))

答案 4 :(得分:0)

如果条目尚不存在,则可以为其添加新名称,然后进行更新以更新现有条目。

import pandas as pd
import random

def foo():
    df = pd.DataFrame()
    year = 2016
    names = ['Bill', 'Bob', 'Ryan']
    for day in range(1, 4, 1):
        for name in names:
            if random.choice([True, False]):   # sometimes a name will be missing
                continue
            value = random.randrange(0, 20, 1) # random value from heuristic
            col = '{}_{}'.format(year, day)    # column name
            new_df = pd.DataFrame({col: value, 'name':name}, index=[1]).set_index('name')
            df = pd.concat([df,new_df[~new_df.index.isin(df.index)].dropna()])
            df.update(new_df)
    #df.set_index('name', inplace=True, drop=True)
    print(df)