如何将默认值归因于 Pandas 数据框列?
How to impute default values to Pandas dataframe columns?
以下是将日期设置为索引的数据集的 df.head()
。
Article_ID Country_Code Sold_Units
Date
2017-01-01 3576 AT 1
2017-01-02 1579 FR 1
2017-01-02 332 FI 2
2017-01-03 3576 AT 1
2017-01-03 332 SE 1
国家代码有 4 个值 'AT, FR, FI, SE'。我想将这 4 个 country_codes 附加到每个日期(如果它们不存在于这些日期)并将它们的值归因于 Article_ID 和 Sold_Units 中的 0。
示例输出基本上应该如下所示:
Article_ID Country_Code Sold_Units
Date
2017-01-01 3576 AT 1
2017-01-01 0 FR 0 # FR FI SE added with 0s.
2017-01-01 0 FI 0
2017-01-01 0 SE 0
2017-01-02 0 AT 0 # AT, SE added
2017-01-02 1579 FR 1
2017-01-02 332 FI 2
2017-01-02 0 SE 0
2017-01-03 3576 AT 1
2017-01-03 0 FR 0 # FR, FI added
2017-01-03 0 FI 0
2017-01-03 332 SE 1
如何为每个国家代码添加这样的默认值?
独特 DatetimeIndex
与 Country_Code
组合的解决方案:
通过将 Country_Code
添加到 DatetimeIndex
来创建 MultiIndex
,其中包含日期时间唯一值的所有组合以及带有 DataFrame.reindex
:
的代码
df = (df.set_index('Country_Code', append=True)
.reindex(pd.MultiIndex.from_product([df.index.unique(), df['Country_Code'].unique()],
names=['Date','Country_Code']), fill_value=0)
.reset_index(level=1))
print (df)
Country_Code Article_ID Sold_Units
Date
2017-01-01 AT 3576 1
2017-01-01 FR 0 0
2017-01-01 FI 0 0
2017-01-01 SE 0 0
2017-01-02 AT 0 0
2017-01-02 FR 1579 1
2017-01-02 FI 332 2
2017-01-02 SE 0 0
2017-01-03 AT 3576 1
2017-01-03 FR 0 0
2017-01-03 FI 0 0
2017-01-03 SE 332 1
或使用 DataFrame.unstack
DataFrame.stack
:
df = (df.set_index('Country_Code', append=True)
.unstack(fill_value=0)
.stack()
.reset_index(level=1))
print (df)
Country_Code Article_ID Sold_Units
Date
2017-01-01 AT 3576 1
2017-01-01 FI 0 0
2017-01-01 FR 0 0
2017-01-01 SE 0 0
2017-01-02 AT 0 0
2017-01-02 FI 332 2
2017-01-02 FR 1579 1
2017-01-02 SE 0 0
2017-01-03 AT 3576 1
2017-01-03 FI 0 0
2017-01-03 FR 0 0
2017-01-03 SE 332 1
具有国家代码的每个日期时间的多个值的解决方案:
错误表示数据如下:
print (df)
Article_ID Country_Code Sold_Units
Date
2017-01-01 3576 AT 1
2017-01-02 1579 FI 1 <-FI
2017-01-02 332 FI 2 <-FI
2017-01-03 3576 AT 1
2017-01-03 332 SE 1
df = (df.groupby(['Date','Country_Code'])
.sum()
.unstack(fill_value=0)
.stack()
.reset_index(level=1))
print (df)
Country_Code Article_ID Sold_Units
Date
2017-01-01 AT 3576 1
2017-01-01 FI 0 0
2017-01-01 SE 0 0
2017-01-02 AT 0 0
2017-01-02 FI 1911 3
2017-01-02 SE 0 0
2017-01-03 AT 3576 1
2017-01-03 FI 0 0
2017-01-03 SE 332 1
使用pivot_table
的另一个解决方案:
import pandas as pd
df = pd.DataFrame({'Date': {0: '2017-01-01', 1: '2017-01-02', 2: '2017-01-02', 3: '2017-01-03', 4: '2017-01-03'},
'Article_ID': {0: 3576, 1: 1579, 2: 332, 3: 3576, 4: 332},
'Country_Code': {0: 'AT', 1: 'FR', 2: 'FI', 3: 'AT', 4: 'SE'},
'Sold_Units': {0: 1, 1: 1, 2: 2, 3: 1, 4: 1}})
df.set_index("Date",inplace=True)
result = (df.pivot_table(index="Date", columns="Country_Code", values=["Article_ID","Sold_Units"],aggfunc="mean")
.fillna("0").stack().reset_index(level=1))
print (result)
#
Country_Code Article_ID Sold_Units
Date
2017-01-01 AT 3576 1
2017-01-01 FI 0 0
2017-01-01 FR 0 0
2017-01-01 SE 0 0
2017-01-02 AT 0 0
2017-01-02 FI 332 2
2017-01-02 FR 1579 1
2017-01-02 SE 0 0
2017-01-03 AT 3576 1
2017-01-03 FI 0 0
2017-01-03 FR 0 0
2017-01-03 SE 332 1
以下是将日期设置为索引的数据集的 df.head()
。
Article_ID Country_Code Sold_Units
Date
2017-01-01 3576 AT 1
2017-01-02 1579 FR 1
2017-01-02 332 FI 2
2017-01-03 3576 AT 1
2017-01-03 332 SE 1
国家代码有 4 个值 'AT, FR, FI, SE'。我想将这 4 个 country_codes 附加到每个日期(如果它们不存在于这些日期)并将它们的值归因于 Article_ID 和 Sold_Units 中的 0。
示例输出基本上应该如下所示:
Article_ID Country_Code Sold_Units
Date
2017-01-01 3576 AT 1
2017-01-01 0 FR 0 # FR FI SE added with 0s.
2017-01-01 0 FI 0
2017-01-01 0 SE 0
2017-01-02 0 AT 0 # AT, SE added
2017-01-02 1579 FR 1
2017-01-02 332 FI 2
2017-01-02 0 SE 0
2017-01-03 3576 AT 1
2017-01-03 0 FR 0 # FR, FI added
2017-01-03 0 FI 0
2017-01-03 332 SE 1
如何为每个国家代码添加这样的默认值?
独特 DatetimeIndex
与 Country_Code
组合的解决方案:
通过将 Country_Code
添加到 DatetimeIndex
来创建 MultiIndex
,其中包含日期时间唯一值的所有组合以及带有 DataFrame.reindex
:
df = (df.set_index('Country_Code', append=True)
.reindex(pd.MultiIndex.from_product([df.index.unique(), df['Country_Code'].unique()],
names=['Date','Country_Code']), fill_value=0)
.reset_index(level=1))
print (df)
Country_Code Article_ID Sold_Units
Date
2017-01-01 AT 3576 1
2017-01-01 FR 0 0
2017-01-01 FI 0 0
2017-01-01 SE 0 0
2017-01-02 AT 0 0
2017-01-02 FR 1579 1
2017-01-02 FI 332 2
2017-01-02 SE 0 0
2017-01-03 AT 3576 1
2017-01-03 FR 0 0
2017-01-03 FI 0 0
2017-01-03 SE 332 1
或使用 DataFrame.unstack
DataFrame.stack
:
df = (df.set_index('Country_Code', append=True)
.unstack(fill_value=0)
.stack()
.reset_index(level=1))
print (df)
Country_Code Article_ID Sold_Units
Date
2017-01-01 AT 3576 1
2017-01-01 FI 0 0
2017-01-01 FR 0 0
2017-01-01 SE 0 0
2017-01-02 AT 0 0
2017-01-02 FI 332 2
2017-01-02 FR 1579 1
2017-01-02 SE 0 0
2017-01-03 AT 3576 1
2017-01-03 FI 0 0
2017-01-03 FR 0 0
2017-01-03 SE 332 1
具有国家代码的每个日期时间的多个值的解决方案:
错误表示数据如下:
print (df)
Article_ID Country_Code Sold_Units
Date
2017-01-01 3576 AT 1
2017-01-02 1579 FI 1 <-FI
2017-01-02 332 FI 2 <-FI
2017-01-03 3576 AT 1
2017-01-03 332 SE 1
df = (df.groupby(['Date','Country_Code'])
.sum()
.unstack(fill_value=0)
.stack()
.reset_index(level=1))
print (df)
Country_Code Article_ID Sold_Units
Date
2017-01-01 AT 3576 1
2017-01-01 FI 0 0
2017-01-01 SE 0 0
2017-01-02 AT 0 0
2017-01-02 FI 1911 3
2017-01-02 SE 0 0
2017-01-03 AT 3576 1
2017-01-03 FI 0 0
2017-01-03 SE 332 1
使用pivot_table
的另一个解决方案:
import pandas as pd
df = pd.DataFrame({'Date': {0: '2017-01-01', 1: '2017-01-02', 2: '2017-01-02', 3: '2017-01-03', 4: '2017-01-03'},
'Article_ID': {0: 3576, 1: 1579, 2: 332, 3: 3576, 4: 332},
'Country_Code': {0: 'AT', 1: 'FR', 2: 'FI', 3: 'AT', 4: 'SE'},
'Sold_Units': {0: 1, 1: 1, 2: 2, 3: 1, 4: 1}})
df.set_index("Date",inplace=True)
result = (df.pivot_table(index="Date", columns="Country_Code", values=["Article_ID","Sold_Units"],aggfunc="mean")
.fillna("0").stack().reset_index(level=1))
print (result)
#
Country_Code Article_ID Sold_Units
Date
2017-01-01 AT 3576 1
2017-01-01 FI 0 0
2017-01-01 FR 0 0
2017-01-01 SE 0 0
2017-01-02 AT 0 0
2017-01-02 FI 332 2
2017-01-02 FR 1579 1
2017-01-02 SE 0 0
2017-01-03 AT 3576 1
2017-01-03 FI 0 0
2017-01-03 FR 0 0
2017-01-03 SE 332 1