我有这个dataframe:
Env location lob grid row server model make slot
Prod USA Market AB3 bc2 Server123 Hitachi dcs 1
Prod USA Market AB3 bc2 Server123 Hitachi dcs 2
Prod USA Market AB3 bc2 Server123 Hitachi dcs 3
Prod USA Market AB3 bc2 Server123 Hitachi dcs 4
Dev EMEA Ins AB6 bc4 Serverabc IBM abc 3
Dev EMEA Ins AB6 bc4 Serverabc IBM abc 3
Dev EMEA Ins AB6 bc4 Serverabc IBM abc 3
Dev EMEA Ins AB6 bc4 Serverabc IBM abc 4
Dev EMEA Ins AB6 bc4 Serverabc IBM abc 5
Dev EMEA Ins AB6 bc4 Serverabc IBM abc 5
Dev EMEA Ins AB6 bc4 Serverabc IBM abc 6
UAT PAC Retail AB6 bc4 Serverzzz Cisco ust 3
UAT PAC Retail BB6 bc4 Serverzzz Cisco ust 4
UAT PAC Retail BB6 bc4 Serverzzz Cisco ust 5
UAT PAC Retail BB6 bc4 Serverzzz Cisco ust 6
在本示例中:
- 如果型号为IBM,则必须有8个插槽;因为slot从slot=3开始,所以它必须从3到10。在这种情况下,仅存在插槽3至6。
- 因此,我需要再添加4行(插槽7、8、9、10)。
- 如果型号为Cisco,则Cisco的行数需要为6。仅插槽3至6存在。
- 因此,我需要再添加2行
新行:
- 必须重复模型的最后一行,同时递增插槽编号
- 他们的“网格”单元格必须显示“可用”。
这需要通过编程来完成,在给定模型的情况下,我需要知道插槽的总数,如果插槽的数量很短,我需要创建新的行。
最后一个数组应该是这样的:
Env location lob grid row server model make slot
Prod USA Market AB3 bc2 Server123 Hitachi dcs 1
Prod USA Market AB3 bc2 Server123 Hitachi dcs 2
Prod USA Market AB3 bc2 Server123 Hitachi dcs 3
Prod USA Market AB3 bc2 Server123 Hitachi. dcs 4
Dev EMEA Ins. AB6 bc4 Serverabc IBM abc 3
Dev EMEA Ins. AB6 bc4 Serverabc IBM abc 4
Dev EMEA Ins. AB6 bc4 Serverabc IBM abc 5
Dev EMEA Ins. AB6 bc4 Serverabc IBM abc 6
Dev EMEA Ins. available bc4 Serverabc IBM abc 7
Dev EMEA Ins. available bc4 Serverabc IBM abc 8
Dev EMEA Ins. available bc4 Serverabc IBM abc 9
Dev EMEA Ins. available bc4 Serverabc IBM abc 10
UAT PAC Retail AB6 bc4 Serverzzz Cisco ust 3
UAT PAC Retail BB6 bc4 Serverzzz Cisco ust 4
UAT PAC Retail BB6 bc4 Serverzzz Cisco ust 5
UAT PAC Retail BB6 bc4 Serverzzz Cisco ust 6
UAT PAC Retail available bc4 Serverzzz Cisco ust 7
UAT PAC Retail available bc4 Serverzzz Cisco ust 8
我试过这样的东西:
def slots(row):
if 'IBM' in row['model']:
number_row=8
if 'Cisco' in row['model']:
number_row=6
我该怎么做?
6条答案
按热度按时间ljo96ir51#
我将使用
groupby.apply
向每个 model 添加新行。一般工作流程如下。1.从每个模型中删除重复的插槽。
1.按
'model'
列对该框架进行分组。1.对于每个模型,只有在以下情况下才能做任何事情
a.它是IBM或Cisco(通过它是否是
N_slots
字典中的键来识别)B.槽数未达到要求的槽数(
N_slots
字典中的值)1.如果满足(3),则使用
reindex()
添加新的空行。1.为
'slots'
列分配槽值(例如,对于IBM,则为3-10)1.在
grid
列中用“available”填充新创建的空行。1.用上一行的值(
ffill()
)填充所有其他新创建的行。1.重置索引以删除重复索引。
zengzsys2#
所提出的函数
arrange_model_slots
为所需模型的组提供处理,应用注入错过的插槽号和标记底层的逻辑,可选地附加行:rsaldnfx3#
需要填充的记录数可以在字典的第一行输入:
输出量:
3hvapo4f4#
必填模块
已用输入
在您的注解之后,所有列都以“object”类型开始。该解决方案对于包含字符串和整数混合的'slot'列是健壮的,如您的相关问题how do you convert data frame column values to integer中所述。
设置外部条件
开始,一个字典看起来适合预先设置目标,即。每个型号的任意最大插槽数。我们将在上面迭代:
方法:
1.使用从
[]
解析内部调用的def missing_rows()
生成缺少的插槽1.使用
pd.concat
将它们集成到嵌入式框架中1.按升序对插槽重新编号
1.使用 sort 和 fill 完成从初始行复制内容。
**最终输出:**所有行已排序,内容为必填项。
灵感来源:
yc0p9oo05#
如果我对你的问题理解正确的话,你可以为IBM和Cisco添加新的行,如下所示:
这将给给予一个输出(然后你可以根据你的需要排序):
qvk1mo1f6#
两个主要观点:
1.应用
numpy.repeat
复制记录1.应用
.idxmax()
查找模型的最后一条记录(或.last()
查找排序数据)