假设一个数据帧由两列A = {1,2,3} B = {'a b c d','e f g h','i j k l'}组成。对于A = 2,我想将B列中的相应条目更改为'e f h'。 (即,提取第一个,第二个和最后一个单词,不要删除第三个单词,不一样)。
使用df.loc [df ['colA'] = 2,'colB']。str.split()。str [x]提取单个单词很容易,其中x = 0,1和-1 ,但是我很难将三个单词有效地重新组合成一个字符串。下面提供了我能想到的最有效的方法。是否有更好的方法来实现我要完成的任务?谢谢。
y = lambda x : df.loc[df['colA']==2,'colB'].str.split().str[x]
df.loc[df['colA']=2,'colB'] = y(0) + ' ' + y(1) + ' ' + y(-1)
预期和实际结果:
A B
1 a b c d
2 e f h
3 i j k l
答案 0 :(得分:0)
如何?
df = pd.DataFrame(data = {'A': [1,2,3],
'B': ['a b c d', 'e f g h', 'i j k l']})
y = lambda x : df.loc[df['A']==2,'B'].str[0:2*x+2] + df.loc[df['A']==2,'B'].str[-1]
df.loc[df1['A']==2,'B'] = y(1)
然后df
是通缉犯:
A B
0 1 a b c d
1 2 e f h
2 3 i j k l
答案 1 :(得分:0)
您非常接近解决方案,唯一的问题是#include <iostream>
#include <string>
using namespace std;
int main() {
int y;
cout << "How many people do you want to enter= \n";
cin >> y;
string names[10];
int pancakes[10];
for (int i = 0; i <= y-1 ; i++) {
cout << "enter name= ";
cin >> names[i];
cout << "num of pancakes= ";
cin >> pancakes[i];
}
int maxEaten = pancakes[0];
int minEaten = pancakes[0];
string maxPer = names[0];
string minPer = names[0];
for (int k = 1; k < y; k++) {
if (pancakes[0] < pancakes[k]) {
maxEaten = pancakes[k];
maxPer = names[k];
}
if (pancakes[0] > pancakes[k]) {
minEaten = pancakes[k];
minPer = names[k];
}
}
cout << maxPer << " ate " << maxEaten << " which is the maximum." << endl;
cout << minPer << " ate " << minEaten << " which is the minimum." << endl;
system("pause");
}
返回包装在Series对象中的值。您可以通过如下所示从Series中提取值来解决此问题:
str[x]
您还可以通过应用apply函数来实现同样的目的
y = lambda x : df.loc[df['colA']==2,'colB'].str.split().str[x].values[0]
df.loc[df['colA']==2,'colB'] = y(0) + ' ' + y(1) + ' ' + y(-1)