首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >根据条件在现有列中添加新行

根据条件在现有列中添加新行
EN

Stack Overflow用户
提问于 2020-01-13 22:23:25
回答 2查看 88关注 0票数 1

我有一个数据框,它有四个列,分别是范围、天气、标志和计算。我需要从三个列(范围、天气和标志)的三个列表中获取组合,并检查这三个列的组合是否存在,然后在数据框中添加新行。

代码语言:javascript
运行
复制
range   weather  flag   calculation
 0-5    good      y      12
 5-6    good      n      14
 0-5    bad       n      2
 5-6    worse     y      5

输出如下:

代码语言:javascript
运行
复制
range   weather  flag   calculation
 0-5    good      y       12
 0-5    bad       n        2
 0-5    good      n       null
 0-5    worse     n       null
 0-5    bad       y       null
 0-5    worse     y       null
 5-6    good      n       14
 5-6    worse     y        5
 5-6    bad       n       null
 5-6    worse     n       null
 5-6    bad       y       null
 5-6    good      y       null

我尝试的代码如下:

代码语言:javascript
运行
复制
r=['0-5','5-6']
w=['good','bad','worse']
f=['n','y']
for i in r:
    for j in w:
        for k in f:
            if i in data1['range'].values and j in data1['weather'].values and k in data1['flag'].values:
            print(i,j,k)
            print("yes")      
        else:
            print(i,j,k)
            print("no")
            data1=data1.append([{'bl_flag':j},{'weather_status':k}], ignore_index=True)
        print(data1)

上面的代码没有检查所有3个组合是否都出现在一行中,如果没有出现在一行中,则必须将其附加到数据帧中。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-01-21 14:28:35

代码语言:javascript
运行
复制
r=['0-5','5-6']
w=['good','bad','worse']
f=['n','y']
for i in r:
    for j in f:
        for k in w:          
            count=data1[data1["range"]==i].groupby(["range","weather","flag"]).apply(lambda x: x[(x["flag"]==j)&(x["weather"]==k).any()])              
            if count.size==0:
                data1=data1.append({'flag':j,'weather':k}, ignore_index=True)
票数 1
EN

Stack Overflow用户

发布于 2020-01-17 17:50:03

解决此问题的一种方法是创建一个DataFrame,其中包含来自"range", "weather" and "flag"列的所有可能的值组合,然后使用outer join将新的DataFrame与原始DataFrame合并。

要使用所有可能的组合创建数据帧,请执行以下操作:

代码语言:javascript
运行
复制
r=['0-5','5-6']
w=['good','bad','worse']
f=['n','y']

res = [[i, j, k] for i in r  
                 for j in w 
                 for k in f] 

cls = ["range","weather","flag"]

df1 = pd.DataFrame(res,columns  =  cls)
df1

输出:

代码语言:javascript
运行
复制
   range weather flag
0    0-5    good    n
1    0-5    good    y
2    0-5     bad    n
3    0-5     bad    y
4    0-5   worse    n
5    0-5   worse    y
6    5-6    good    n
7    5-6    good    y
8    5-6     bad    n
9    5-6     bad    y
10   5-6   worse    n
11   5-6   worse    y

现在,您可以通过以下方式使用outer join将此DataFrame与原始DataFrame合并:

代码语言:javascript
运行
复制
new_df = pd.merge(df1, orignal_df,  how='outer', left_on=cls, right_on = cls)

输出:

代码语言:javascript
运行
复制
   range weather flag  calculation
0    0-5    good    n          NaN
1    0-5    good    y          NaN
2    0-5     bad    n          NaN
3    0-5     bad    y          NaN
4    0-5   worse    n          NaN
5    0-5   worse    y          NaN
6    5-6    good    n          NaN
7    5-6    good    y          NaN
8    5-6     bad    n          NaN
9    5-6     bad    y          NaN
10   5-6   worse    n          NaN
11   5-6   worse    y          NaN
12   0-5    good    y         12.0
13   5-6    good    n         14.0
14   0-5     bad    n          2.0
15   5-6   worse    y          5.0
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59718494

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档