似乎很简单,无法为此找到解决方案。
我的df如下:
ID, Week
5, 1
6, 1
7, 1
我有如下原因码列表
['Work', 'Holiday', 'Sick', 'Jury']
我想做的是将其添加到当前数据框中,然后乘以每个唯一的ID
所以我会有类似的信息(为简洁起见,我将仅使用1个唯一ID)。
ID, Week, Reason
5, 1, 'Work'
5, 1, 'Holiday'
5, 1, 'Sick',
5, 1, 'Jury'
我已经尝试了各种形式的concat,但轴的变化却很大,但是我并不明智。
任何帮助将不胜感激。
答案 0 :(得分:2)
您可以使用itertools
:
import itertools
df_new=(pd.DataFrame(list(itertools.product(df.ID,df.Week,reason_codes)),
columns=df.columns.tolist()+['Reason']).drop_duplicates().reset_index(drop=True))
print(df_new)
ID Week Reason
0 5 1 Work
1 5 1 Holiday
2 5 1 Sick
3 5 1 Jury
4 6 1 Work
5 6 1 Holiday
6 6 1 Sick
7 6 1 Jury
8 7 1 Work
9 7 1 Holiday
10 7 1 Sick
11 7 1 Jury
答案 1 :(得分:2)
让我们做unnesting
df['Reason']=[l]*len(df)
unnesting(df,['Reason'])
Out[1014]:
Reason ID Week
0 Work 5 1
0 Holiday 5 1
0 Sick 5 1
0 Jury 5 1
1 Work 6 1
1 Holiday 6 1
1 Sick 6 1
1 Jury 6 1
2 Work 7 1
2 Holiday 7 1
2 Sick 7 1
2 Jury 7 1
# attached self-define function
def unnesting(df, explode):
idx=df.index.repeat(df[explode[0]].str.len())
df1=pd.concat([pd.DataFrame({x:np.concatenate(df[x].values)} )for x in explode],axis=1)
df1.index=idx
return df1.join(df.drop(explode,1),how='left')
或者我们进行交叉联接
df.merge(pd.DataFrame({'Reason':l}).assign(Week=1))
Out[1020]:
ID Week Reason
0 5 1 Work
1 5 1 Holiday
2 5 1 Sick
3 5 1 Jury
4 6 1 Work
5 6 1 Holiday
6 6 1 Sick
7 6 1 Jury
8 7 1 Work
9 7 1 Holiday
10 7 1 Sick
11 7 1 Jury
答案 2 :(得分:1)
让static List <ImpinjReader> readers = new List <ImpinjReader>();
List<ImpinjReader> DistinctReaders = readers.Distinct().ToList();
public bool Con()
{
try
{
readers.Add(new ImpinjReader(address, ""));
foreach (ImpinjReader reader in DistinctReaders)
{
// From here I am receiving a duplicate ip addresses
// assigned with ascending count values inside
// DistinctReaders.
}
}
}
为原因列表
codes
为数据帧的所有行分配相同的代码。 RHS上的语法仅将列表重复N次,其中N是数据帧的长度
codes = ['Work', 'Holiday', 'Sick', 'Jury']
然后堆叠df['codes'] = [codes] * len(df)
列,即从水平格式更改为垂直格式。在此步骤中,还必须将codes
和ID
列设置为索引,然后在完成堆栈操作后将其重置。
Week
输出:
df.set_index(['ID','Week']).codes.apply(pd.Series).stack().reset_index(['ID', 'Week'])
剩下的唯一事情就是为新创建的列分配一个适当的名称,如果您的代码依赖于索引值,请对其进行适当地修复。在此版本中,索引值会从原始数据帧开始保留并重复四次
答案 3 :(得分:1)
我认为您只需要从
创建一个DataFramedf_codes = pd.DataFrame({'codes': ['Work', 'Holiday', 'Sick', 'Jury']})
此后,您只需要像该线程join-two-dataframes-with-no-common-columns-for-calculations一样在没有公共列的情况下交叉连接DataFrames
基于该线程,在创建df_codes
之后,您只需要以下命令:
df_new = df.assign(a=1).merge(df_codes.assign(a=1)).drop('a', 1)
输出:
Out[148]:
ID Week codes
0 5 1 Work
1 5 1 Holiday
2 5 1 Sick
3 5 1 Jury
4 6 1 Work
5 6 1 Holiday
6 6 1 Sick
7 6 1 Jury
8 7 1 Work
9 7 1 Holiday
10 7 1 Sick
11 7 1 Jury