【问题标题】:How do I create a new column in a csv file using Pandas, and add data depending on the values in those columns如何使用 Pandas 在 csv 文件中创建新列,并根据这些列中的值添加数据
【发布时间】:2019-11-25 19:59:36
【问题描述】:

我正在尝试根据该列的部分信息使用另一列的数据创建一列,例如我有一个设备列表:

 devicename        make     devicevalue
 switch1           cisco        0
 switch1-web100    netgear      0  
 switch10          cisco        0
 switch23          cisco        1
 switch31-web200   netgear      0
 switch31          cisco        1
 switch40          cisco        1

该列需要有 2 个变量:

  • 如果make == netgear(设置为0)
  • 如果devicename 以 20 或更大(设置为 1,否则设置为 0)结尾
  • 或者,devicename 也可以被 web 过滤,而不是同时查看 make。

我正在使用 Pandas 打开 CSV 文件,进行编辑(对于其他一些列)然后保存它,但我在这方面遇到了困难。

这是我到达的地方,但我知道它不起作用但我有点迷茫,而且我对 Python 还是很陌生:

import pandas as pd

df = pd.read_csv('data.csv')
df['devicevalue'] = df.devicename
    if 'netgear' in df.name df.set_value '0'
    if str.endswith > 20 df.set_value '0'
    else if df.set_value '1'

【问题讨论】:

    标签: python python-3.x pandas csv


    【解决方案1】:

    尝试以下方法:

    import pandas as pd
    
    df = pd.DataFrame(columns=['devicename', 'make'])
    df.loc[0] = ['switch1', 'cisco']
    df.loc[1] = ['switch1-web100', 'netgear']
    df.loc[2] = ['switch10', 'cisco']
    df.loc[3] = ['switch23', 'cisco']
    df.loc[4] = ['switch31-web200', 'netgear']
    df.loc[5] = ['switch31', 'cisco']
    df.loc[6] = ['switch40', 'cisco']
    
    
    def get_number_suffix(devicename: str) -> int:
        """
        This function looks at the last several characters, and extracts
        the last n contiguous digits, and returns as an integer.
        :param devicename:
        :return:
        """
        i = 1
        while i < len(devicename) and devicename[-i:].isnumeric():
            i += 1
    
        return int(devicename[-(i-1):])
    
    
    def compute_devicevalue(row) -> int:
        """
        This function computes the devicevalue based on the criteria:
        If make = netgear (set to 0)
        If devicename end in 20 or greater (set to 1, otherwise set to 0)
        :param row:
        :return:
        """
    
        if 'netgear' in row['make']:
            return 0
        if 20 <= get_number_suffix(row['devicename']):
            return 1
        else:
            return 0
    
    
    df['devicevalue'] = df.apply(compute_devicevalue, axis=1)
    print(df.head(7))
    

    【讨论】:

    • 谢谢您的回复,我看看我能不能完成这项工作,我需要在顶部导入每个行项目吗?因为我有大约 9000 条记录,我必须从另一个工具中导出,然后处理并添加这个新列
    • 不,不。我只是为了这个例子。您绝对应该在您的问题中使用“read_csv”。
    • 这非常有效,谢谢,我还必须添加另一个 if 语句来删除模型变体,但现在我可以轻松添加它,因为我可以看到如何创建它。
    【解决方案2】:

    您在处理数据时似乎遇到了问题。这是我将如何处理这个问题。使用 for 循环循环遍历每列中的不同元素,然后在循环时对每个元素使用逻辑。 This question previously 找到了一种将字母与数字分开的好方法;他们比我解释得更好。

    Make   = ['cisco', 'netgear', 'cisco', 'cisco', 'netgear']
    Number = ['switch1', 'switch1-web100', 'switch10', 'switch23', 'switch31-web200']
    newcol = []
    for i, j in enumerate(Make):
        if i == 'netgear':
            if int(re.split('(\d+)',Number[j])[-1]) > 20:
                newcol.append(1)
            else:
                newcol.append(0)
        else:
            newcol.append(0)
    

    【讨论】:

    • 广播方法可能会更好地扩展。
    • 你说得对,这样会更快。好主意!
    • 感谢您的回复/帮助,即使我没有使用此方法
    猜你喜欢
    • 2022-10-14
    • 2021-04-09
    • 2021-10-03
    • 1970-01-01
    • 2018-03-14
    • 2020-04-16
    • 1970-01-01
    • 2022-11-16
    • 1970-01-01
    相关资源
    最近更新 更多