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
中添加新值,然后使用
lreshape
将 Value
和 Value2
列合并为一个:
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
我正在寻找一种在现有数据框中添加行的有效方法 当行迭代在列中找到特定字符时。这个新行将是当前迭代行的副本,只是修改了值。
这是我正在寻找的示例: 例如,如果 "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
中添加新值,然后使用
lreshape
将 Value
和 Value2
列合并为一个:
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