Python:当数据框中的行迭代在列的字符串中找到字母时添加一行

Python: Adding a row when row iteration in dataframe find letter in string of a column

我正在寻找一种在现有数据框中添加行的有效方法 当行迭代在列中找到特定字符时。这个新行将是当前迭代行的副本,只是修改了值。

这是我正在寻找的示例: 例如,如果 "string" 列中的对象包含 "M",则使用行迭代 将 50 添加到 "Value" 中的值之后创建该行的副本 专栏

我有:

        Name               String        Value
0      name1                 EXAN        100.1
1      name2                EXAN_        200.2
2      name3               EXAMPL        300.3 
3      name4              EXAMPLE        400.4 
4      name5                 TEST        500.5 

我在找什么:

        Name               String        Value
0      name1                 EXAN        100.1
1      name2                EXAN_        200.2
2      name3               EXAMPL        300.3
3      name3               EXAMPL        350.3
4      name4              EXAMPLE        400.4
5      name4              EXAMPLE        450.4 
6      name5                 TEST        500.5 

我试过了:

for i, row in df.iterrows():
    if "M" in row['String']:
        df.add_row([row.Name, row.String, row.Value+50])

我得到:

Traceback (most recent call last):
  File "<stdin>", line 3, in <module>
  File "/usr/local/lib/python2.7/dist-packages/pandas/core/generic.py", line 1843, in __getattr__
    (type(self).__name__, name))
AttributeError: 'DataFrame' object has no attribute 'add_row'

这里有更多信息:

>>> df.dtypes
Name              object
String            object
Value             float64

>>> type(df)
<class 'pandas.core.frame.DataFrame'>

如有任何帮助,我们将不胜感激

一种方法是在 Value2 中添加新值,然后使用 lreshapeValueValue2 列合并为一个:

import pandas as pd
df = pd.DataFrame(
    {'Name': ['name1', 'name2', 'name3', 'name4', 'name5'],
     'String': ['EXAN', 'EXAN_', 'EXAMPL', 'EXAMPLE', 'TEST'],
     'Value': [100.1, 200.2, 300.3, 400.4, 500.5]})
df['Value2'] = np.where(df['String'].str.contains(r'M'), df['Value']+50, np.nan)
df = df.reset_index(drop=False)
df = pd.lreshape(df, {'Value': ['Value', 'Value2']})
df = df.sort_values(by='index')
df = df.drop('index', axis=1)

产量

    Name   String  Value
0  name1     EXAN  100.1
1  name2    EXAN_  200.2
2  name3   EXAMPL  300.3
5  name3   EXAMPL  350.3
3  name4  EXAMPLE  400.4
6  name4  EXAMPLE  450.4
4  name5     TEST  500.5

编辑:事实证明,这可以直接使用数据帧来完成(尽管不是在适当的位置),而且 unutbu 的方法比迭代快得多。我会在这里留下这个答案,以防你对如何使用你计划使用的相同类型的迭代来做到这一点感兴趣,只是使用列表而不是插入到位,但请注意 unutbu 的版本似乎是大约 100 次更快:

df = pd.DataFrame( {'Name': [1,2,3], 'String': ['M','N','M'], 'Value': [4,5,6]} )
l = []
for _, row in df.iterrows():
    l.append([row.Name, row.String, row.Value+50])
    if "M" in row['String']:
        l.append([row.Name, row.String, row.Value+50])
df = pd.DataFrame( l, columns=['Name','String','Value'])
df