我想通过将行的一些元素转换为列来重新格式化数据帧。 提供我的意思的一个例子。
在下面的数据框中,我希望代码列中的所有元素都是单独的列。像'JFK 10/06 XX'这样缺失的行应填充为0或nan。
原始DataFrame:
loc date code
--- ----- ----
LGA 10/05 XX
LGA 10/06 XX
LGA 10/07 XX
LGA 10/05 YY
LGA 10/06 YY
LGA 10/07 YY
JFK 10/05 XX
###JFK 10/06 XX (missing)
JFK 10/07 XX
JFK 10/05 YY
JFK 10/06 YY
JFK 10/07 YY
要格式化DataFrame:
loc date XX YY
--- ----- -- --
LGA 10/05 1 1
LGA 10/06 1 1
LGA 10/07 1 1
JFK 10/05 1 1
JFK 10/06 0 1
JFK 10/07 1 1
这里JFK - > 10/06在XX中有一个条目0
我尝试使用其他列进行分组并能够验证计数,但我无法按预期的方式对其进行格式化。
答案 0 :(得分:3)
您正在尝试将数据重新整形为宽格式而不使用值列。一种选择是使用pivot_table
并将size
指定为聚合函数,它将计算索引和列的组合并作为值填充。缺少的值可以用fill_value
参数替换:
df.pivot_table(index = ['loc', 'date'], columns = 'code',
aggfunc='size', fill_value=0).reset_index()
#code loc date XX YY
# 0 JFK 10/05 1 1
# 1 JFK 10/06 0 1
# 2 JFK 10/07 1 1
# 3 LGA 10/05 1 1
# 4 LGA 10/06 1 1
# 5 LGA 10/07 1 1
答案 1 :(得分:1)
使用crosstab
的另一个解决方案,它计算UITableViewCell
参数中出现的值的出现频率:
columns
注意:将列命名为' loc'这不是一个好习惯。巧合的是pd.crosstab(index=[df['loc'], df['date']], columns=df['code']) \
.reset_index(level=1) \
.sort_index(ascending=False)
用于执行基于标签的位置索引的方法。
答案 2 :(得分:0)
stack
数据框new_df = (df.set_index(keys=['loc','date'])
.stack()
.reset_index()
.pivot_table(index=['loc','date'], columns=0, fill_value=0, aggfunc='size'))
输出:
0 XX YY
loc date
JFK 2016-10-05 1 1
2016-10-06 0 1
2016-10-07 1 1
LGA 2016-10-05 1 1
2016-10-06 1 1
2016-10-07 1 1