向数据框添加列表,同时按DF

时间:2019-03-20 17:42:06

标签: python pandas

似乎很简单,无法为此找到解决方案。

我的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,但轴的变化却很大,但是我并不明智。

任何帮助将不胜感激。

4 个答案:

答案 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) 列,即从水平格式更改为垂直格式。在此步骤中,还必须将codesID列设置为索引,然后在完成堆栈操作后将其重置。

Week

输出:

df.set_index(['ID','Week']).codes.apply(pd.Series).stack().reset_index(['ID', 'Week'])

剩下的唯一事情就是为新创建的列分配一个适当的名称,如果您的代码依赖于索引值,请对其进行适当地修复。在此版本中,索引值会从原始数据帧开始保留并重复四次

答案 3 :(得分:1)

我认为您只需要从

创建一个DataFrame
df_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