我正在尝试向熊猫逐步添加行和列。我有很多数据存储在多个数据存储中,并通过启发式方法确定值。当我浏览该数据存储区时,我希望能够以增量方式更新数据框,在某些情况下,名称或日期会丢失。
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
如何合并这些行?
有没有更有效的方法来创建此数据框?
答案 0 :(得分:2)
答案 1 :(得分:2)
尝试一下:-
df.groupby('name')[df.columns.values].sum()
答案 2 :(得分:1)
运行foo()
函数之后,可以使用任何聚合函数(如果每列只有一个值并且所有其他都是空)和groupby
上的df
。 / p>
首先,使用reset_index
返回您的name
列。
然后使用groupby
和apply
。在这里,我提出了一个自定义函数,该函数检查每列是否只有一个值,如果没有,则抛出一个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)