【问题标题】:Python 3 pandas add a column with if then statement using lengthPython 3 pandas 使用长度添加带有 if then 语句的列
【发布时间】:2017-02-11 11:50:35
【问题描述】:

在 Python 3 Pandas 中处理需要创建新列的数据框。我有两个具有不同长度字符串的相似列。新列应返回长度为 13 个字符的第 1 列或第 2 列。在excel中我会写成:c2=if(len(b2)=13,b2,a2)然后把公式复制下来。

我需要解释的代码是:

df = pd.read_csv("example15.csv")

#create a new column with if-then statment
df['13_digit_#'] = (df.column1 len = 13 or df.column2 len = 13)

我将如何重写最后一行? 非常感谢!

【问题讨论】:

  • 数据框的所有列都应该返回相同的 len(col) 参数。也就是说,不可能拥有具有不同长度列的数据框。您的意思是某些列缺少观察结果而其他列没有吗?例如df[col1] = [a,b,c,d, N/A], df[col2] = [a,b,c,d, e]?
  • measure_theory - 我的意思是这些列中的每一列的结果要么是空白,要么是一个或两个数字,要么是 13。通过只给出新列来“清理数据”结果长度为 13 个字符。

标签: pandas if-statement conditional-statements python-3.5 calculated-columns


【解决方案1】:

我认为您可以将numpy.wherestr.lenapply(len) 一起使用:

df['13_digit_#'] = np.where((df.column1.str.len() == 13) | 
                            (df.column2.str.len() == 13), 'a', 'b')

或者如果有其他情况:

df['13_digit_#'] = np.where(df.column1.str.len() == 13, df.column1, df.column2)

示例:

df = pd.DataFrame({'column1':['0123456789abc','a','b'],
                   'column2':['abcabcabcabca','c','d']})

print (df)
         column1        column2
0  0123456789abc  abcabcabcabca
1              a              c
2              b              d

df['13_digit_#'] = np.where(df.column1.str.len() == 13, df.column1, df.column2)
#df['13_digit_#'] = np.where(df.column1.apply(len) == 13, df.column1, df.column2)
print (df)
         column1        column2     13_digit_#
0  0123456789abc  abcabcabcabca  0123456789abc
1              a              c              c
2              b              d              d

【讨论】:

  • 使用了 if-other 条件,即签出。再次感谢耶斯瑞尔!它是一个巨大的数据集并收到警告:“正在尝试在 DataFrame 中的切片副本上设置一个值。尝试使用 .loc[row_indexer, col_indexer] = value 代替。没关系,结果有效并且导出良好。
  • 很高兴能帮到你!
【解决方案2】:

假设每列的空白或缺失元素为 NaN,则以下内容将删除没有完整观察数的列并将其保存为数据框中的新变量

import pandas as pd
import numpy as np

df = pd.DataFrame({'a':[1,2,3], 'b':[1,2,np.nan], 'b':[1, np.nan, np.nan]})

df['newcol'] = df[['a','b']].dropna(axis = 1, how = 'any')

在最后一行,axis = 1 告诉命令查看每一列(a 和 b),“how = 'any'”告诉它删除包含任何缺失值的列并将其保存为 'newcol' .

【讨论】:

  • 哦,不,我不想删除任何数据,任何一列都将包含 13 位字符串,我只想让新列同时查看两个旧列并使用具有 13 位数字的值字符串。
猜你喜欢
  • 2019-10-24
  • 2016-01-05
  • 1970-01-01
  • 2021-06-05
  • 2021-09-10
  • 1970-01-01
  • 2016-03-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多